zoukankan      html  css  js  c++  java
  • 事物的简单介绍!

    package com.aaa.test;
    /**
     * 0.什么是 事物?
     *        1.事物就是一个业务操作的单位
     *         2.事物就是控制一个业务逻辑  要么都执行, 要么都不执行!
     *         3.事务是以业务逻辑为基础的;一个完整的业务应该对应业务层里的一个方法;
    如果业务操作失败,则整个事务回滚;
    所以,事务控制是绝对应该放在业务层的;但是,持久层的设计应该遵循一个很重要的原则:持久层应该保证操作的原子性,就是说持久层里的每个方法都应该是不可以分割的。
     * 
     * 1.事物的操作?
     * 
     * 开启手动事物  con.setAutoCommit(false);
     * 
     * 提交事务?   con.commit();
     * 
     * 事物的回滚?    在catch 中设置
     * 
     * 
     * 2.事物的原理是什么?
     *         1.手动事物 没有提交  程序无错 数据库无变化
     *         2.                    程序出错  数据库也没有变化!
     * 3.事物的特性?
     (1)原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 
    
    (2)一致性(Consistency)
    事务前后数据的完整性必须保持一致。
    
    (3)隔离性(Isolation)
    事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
    
    (4)持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
     *
     *4.事物的隔离级别?
     *
     *
     *5.事物的  脏读  幻读   不可重复读?
     *
     *
     *案例   模拟银行 转账业务
     *         张三   13000
     *         李四    5000
     *张三给李四 转账10000元。
     *1.判断张三 是否有10000 
     *2.张三-10000 李四+10000
     *
     */
    
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    import org.junit.Test;
    
    public class ShiWuDemo {
        @Test
        public void Demo() throws Exception {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql:///qy66?characterEncoding=utf-8", "root", "root");
            
            //开启手动提交!  手动提交之后,即使程序出错,数据库表中的数据也不会发生改变!
            con.setAutoCommit(false);
            
            
            //判断张三的余额
            PreparedStatement ps = con.prepareStatement("select * from bank where money>=10000 and name='张三'");
            
            ResultSet rs = ps.executeQuery();
            
            if (rs.next()) {
                //转账操作
                ps = con.prepareStatement("update bank set money=money-10000 where name='张三'");
                ps.executeUpdate();
    
                //int i=1/0;  //bug 测试  发现 程序出错 !在数据库中  张三的钱-10000,但是 李四的钱没有变化,银行出事了!   解决方法   开启手动提交
    
                ps = con.prepareStatement("update bank set money=money+10000 where name='李四'");
                ps.executeUpdate();
                
                //提交事务
                con.commit();
                
                System.out.println("转账成功!");
            }else {
                System.out.println("转账失败!");
            }
            
            rs.close();
            ps.close();
            con.close();
        }
    }
  • 相关阅读:
    Data Structure(2)
    CoreAnimation —— CALayer
    [置顶] android AIDL 进程间通信
    UVA 10057 A mid-summer night's dream. 仲夏夜之梦 求中位数
    基于mini2440的IIC读写(裸机)
    外媒关注:中国法庭用新浪微薄直播薄熙来审判
    [置顶] 吃论扯谈---吃货和Office 365订阅的关系
    小智慧42
    机器学习如何选择模型 & 机器学习与数据挖掘区别 & 深度学习科普
    【Todo】【转载】Spark学习 & 机器学习(实战部分)-监督学习、分类与回归
  • 原文地址:https://www.cnblogs.com/ZXF6/p/11048041.html
Copyright © 2011-2022 走看看