博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jdbc的commit和rollback
阅读量:6228 次
发布时间:2019-06-21

本文共 998 字,大约阅读时间需要 3 分钟。

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);做就可以了。

转载地址:http://bijna.baihongyu.com/

你可能感兴趣的文章
codevs1116
查看>>
聊聊Dubbo(三):架构原理
查看>>
tizen镜像制作
查看>>
Vue表单输入绑定
查看>>
团体程序设计天梯赛-练习集
查看>>
bootstrap使用后一个小bug---不知道大家碰到没
查看>>
Android训练课程(Android Training) - 添加活动栏(使用action bar)
查看>>
Unable to resolve target 'android-18'
查看>>
模拟键盘按键
查看>>
angularJS内置指令一览
查看>>
Redis的管理
查看>>
数字电路建模 - jchdl
查看>>
Tomcat6.x+jndi配置
查看>>
SDWebImage
查看>>
全同态加密算法
查看>>
搭建hexo博客
查看>>
shell编程(一)基础
查看>>
图的着色问题
查看>>
( 转)UVM验证方法学之一验证平台
查看>>
Jdbc&Web
查看>>