事务

来源:互联网 发布:tower软件 编辑:程序博客网 时间:2024/05/21 09:50
A:事务
    事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。在数据库中数据库中的每个操作都是默认提交的(commit)

B:mysql中的事务
    a:mysql引擎是支持事务的
    b:mysql默认自动提交事务(commit),每条语句都处在单独的事务中
    c:手动控制事务
        开启事务:begin
        提交事务:commit
        回滚事务:rollback

C:mysql中begin开始后的事务,只要没有commit,那么期间做的修改就是内存中的,只有在commit后才会将修改写到磁盘中

D:在JDBC中控制事务就是控制对数据库的增删改查

    Connection conn = null;
         PreparedStatement ps = null;

         try {
            conn = DBUtil.getConnection();
            //设置数据库的隔离级别
            //conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);//默认的隔离级别
            conn.setAutoCommit(false);//取消数据库的自动提交,相当于begin
            String sql = "UPDATE account SET money=money-100 WHERE id=?";
            ps = conn.prepareStatement(sql);//取消数据库的自动提交,相当于begin

            ps.setInt(1, 1);
            ps.executeUpdate();//lisi的账户减100元

            int num = 5/0;//当产生异常的时候,只是内存中的修改不会存到磁盘中,会产生异常进行回滚

            sql = "UPDATE account SET money=money+100 WHERE id=?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, 2);
            ps.executeUpdate();//zhaosi的账户加100元

            //提交事务
            conn.commit();
        } catch (Exception e) {
            try {
                conn.rollback();//回滚事务
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }
    }

E:事务的特性:
        a:原子性:指事务是一个不可分割的工作单位,处于同一逻辑下的操作,要么都发生,要么都不发生
        b:一致性:组成1个事务 可能由增、删、改、查四种操作,一致性就是他们要么同时全部成功,要么同时全部失败。成功与失败的操作保持一致
        c: 隔离性:事务的隔离性就是多个用户并发访问数据库的时候,数据库会为每一个用户单独开启一个事务,保证每一个事务不会互相干扰
        d:持久性:是指一个事务被提交之后,它对数据库的改变就是永久性的,即使数据库发生故障也不会对其产生任何影响

F:事务的隔离级别
        a:脏读:指一个事务读取到了另一个事务未提交的数据
        b:不可重复读:指一个事务读取某一行数据的时候,因其他事务同时修改这一行的数据,导致多次的读取数据的不同(update),和脏读的区别是脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。
        c:虚读:指一个事务读取到了另外一个事务插入的数据,导致前后读取的数据不同

G:数据库通过设置一下隔离级别来防止以上的情况发生:
        * 1、READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
        * 2、READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)
        * 4、REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)
        * 8、SERIALIZABLE: 避免赃读、不可重复读、虚读。
        级别越高,性能越低,数据越安全

H:JDBC中控制事务的隔离级别:
       
Connection接口:
            设置隔离级别:必须在开启事务之前。
        Connection.setTransactionIsolation(int level);

        先设置隔离级别,在开启事务。
        Conn.setTransactionIsolation(Connection.*);
        Conn.setAutoCommit(false);



I:数据库中通过以下语句来设置事务的隔离级别:
        set   transaction isolation level 设置事务隔离级别
        select @@tx_isolation    查询当前事务隔离级别


0 0