jdbc事务

一、JDBC开启事务原生代码
    
    Connection conn = DriverManager.getConnection(...);
    try{
        con.setAutoCommit(false);
        Statement stmt = con.createStatement();
        //1 or more queries or updates
        con.commit();
    }catch(Exception e){
        con.rollback();
    }finally{
        con.close();
    }

二、设置隔离级别
    Connection.setTransactionIsolation

三、设置回滚点
    savePoint

四、批处理
    当要批量添加一批数据时,通过一个循环来执行每个PreparedStatement虽然可行,但是性能很低。SQL数据库对SQL语句相同,但只有参数不同的若干语句可以作为batch执行,即批量执行,这种操作有特别优化,速度远远快于循环执行每个SQL。
    核心代码:
        public static void main(String[] args) throws SQLException {
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/t","root","plokm123");
            try {
                con.setAutoCommit(false);
                PreparedStatement ps=con.prepareStatement("insert into t(id,user_id,account) value (?,?,?);");
                for(int i=4;i<30;i++){
                    ps.setInt(1,i);
                    ps.setInt(2,i);
                    ps.setInt(3,i);
                    ps.addBatch();
                }
                ps.executeBatch();
                con.commit();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
                con.rollback();
            }finally {
                con.close();
            }
        }
        

小注

一、关系型数据库有四大特性:
    原子性:记录之前的版本,允许回滚
        原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
    一致性:事务开始和结束之间的中间状态不会被其他事务看到
        致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
        拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
    隔离性:适当的破坏一致性来提升性能与并行度 例如:最终一致~=读未提交
        隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
        即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
    持久性:每一次的事务提交后就会保证不会丢失
        持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
    从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必须要实现AID三大特性,才有可能实现一致性。例如,原子性无法保证,显然一致性也无法保证。

二、数据库的事务应当符合数据库的四大特性
    但是......
    所以......


三、事务的四个隔离级别
    1)脏读(Dirty Reads):所谓脏读就是对脏数据(Drity Data)的读取,而脏数据所指的就是未提交的数据。也就是说,一个事务正在对一条记录做修改,在这个事务完成并提交之前,这条数据是处于待定状态的(可能提交也可能回滚),这时,第二个事务来读取这条没有提交的数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被称为脏读。

    2)不可重复读(Non-Repeatable Reads):一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。也就是说,这个事务在两次读取之间该数据被其它事务所修改。

    3)幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。

标签

评论

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1