`
jishuaige
  • 浏览: 10407 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于Spring的事务

 
阅读更多
关于spring的事务,这里纯粹就是记录一下:
现在在大部分项目中,都会把事务交给Spring来管理,这应该是通用的做法了。
1,Spring的事务管理不到类的private,static,protected方法。因为Spring的事务基于接口动态代理的AOP事务。接口的方法都必然是public的。
   补充:只要最外层的方法交给了Spring的事务管理后,那么在此方法中再调用private等方法是可以被Spring的事务管理的。(这个只是在当前线程中是按照这样来执行的)。
2,有两个类:classA和classB,classA包含methodA1和methodA2,classB包含methodB1和methodB2。
   使用场景一:
   classA.methodA1(classA.methodA2())在methodA1没有被Spring的事务管理的话,就算methodA2可以被Spring的事务管理,也不会开启事务了。这就是AOP的原因。
   使用场景二:
   classA.methodA1(classB.methodB1())在methodA1没有被Spring的事务管理的话,调用的classB的methodB1方法,methodB1如果配置了能被Spring的事务管理。那么Spring的事务会管理methodB1方法。
以上没有被Spring事务管理,自然就给了数据库了。

分析以下情况:
首先Spring的事务配置是do*,start*,server*都会被Spring事务管理。
以下情况会开启几个事务喃?代码走到startXXX()会开启事务,接着开启一个线程,这种情况下,因为已经不是处在同一个线程中,因此事务不会传递下去。doM1是private的,spring的事务不会开启,这样事务就交给了MySQL了,在doM1里面执行的sql语句会commit。
1)
   public void startXXX() {
       new Thread() {
          private void doM1() {}
          public void server1.serverM2() {}
          public void server2.serverM3() {}
       }
   }
server1和server2被spring管理。
server1.serverM2会开启新的事务,server2.serverM3也会开启新的事务。server1和server2各自方法里面的当然就是用同一个事务了。
2)
   public void startXXX() {
       new Thread() {
          private void doM1() {}
          public void doM2() {}
          public void doM3() {}
       }
   }
doM2()里面如果有server调用会开启新的事务,doM3()也会开启新的事务。doM2和doM3各自方法里面的当然就是用同一个事务了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics