zoukankan      html  css  js  c++  java
  • jdbc的commit和rollback

    commit和rollback是数据库事务的两个概念。
    一个数据库事务有开始和结束边界(boundary), 位于boundary的对数据库的各种操作认为是对该事务的操作。
    一个事务的要占用数据库的一些资源,比如可能获得数据库的某个表的某条记录的lock,如果一个事务长期占用资源而不去释放,那么对其他的事务是不利的,可能会使得速度很慢。
    所以对数据库操作的正确做法是让事务短小,只做一些应该在事务里边做的事情,以最快的速度让一个事务结束,从而释放该事务所占有的资源。
    如何让一个事务结束?commit或者rollback。两者选其一,而且必选其一,才能够确保一个事务被可靠的,安全的终止。commit意味着对事务中的操作确定,rollback意味着对事务中的操作否定。

    JDBC中如何正确的处理事务?
    1。如果需要保持一些操作的原子性,比如转帐就需要原子性,那么必须要将这些操作放在一个事务中。
             Connection conn = 。。。;
             conn.setAutoCommit(false);

             //从一个人那里扣钱
             //往另一个人那里加钱

             //做一些其他的事情,比如通过jms来广播一条成功的消息
             conn.commit();

            上面的代码看起来似乎完成了转帐的操作,其实需要的改进的地方很多。
             1)不能保证上面的事务能够可靠的终止。
                   如果对数据库的扣钱,加钱操作失败,那么conn.commit()不会被执行。
             2)通过jms来广播消息动作跟这个事务没有太大的关系,所以不应该放在事务中。试想如果jms广播需要花5s的时间,那么该事务结束的时间就要推迟5s,释放lock的时间也要被推迟5s!
             正确的代码:
             Connection conn = 。。。;
             boolean success = false;
             try{
                    conn.setAutoCommit(false);
                    //从一个人那里扣钱
                    //往另一个人那里加钱
                    conn.commit();
                    success = true;
             }
              catch(SQLException e){
                     conn.rollback();
                     success = false;
              }
               if(success)//做一些其他的事情,比如通过jms来广播一条成功的消息


    2。如果不需要处理原子性的操作,比如查询,那么只需要conn.setAutoCommit(true);做就可以了。

  • 相关阅读:
    f clk hclk pclk
    人必须有强大的精神
    删除数据 DataIntegrityViolationException: notnull property references a null or transient value解决
    网页的!DOCTYPE声明及对网页起何作用(转)
    eclipse spket jquery 插件 错误 loading context has encountered a problem
    【引用】mysql编码设置
    Java中抽象类和接口的区别 经典(转)
    MyEclipse 修改 默认的 工作空间(转)
    Spring启动异常: cvcelt.1: Cannot find the declaration of element 'beans'(转)
    seru ftp 上传 文件 出现如下 错误 200 227 501
  • 原文地址:https://www.cnblogs.com/zhwl/p/2836791.html
Copyright © 2011-2022 走看看