关于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各自方法里面的当然就是用同一个事务了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值