事务,循环执行,心得

@Transactional:
在同一个类中,注解在方法上被调用是无效的.

如果注解在方法上:
这个方法被同一个接口重复调用的话,那么每次调用都会启用一个新的事务.
事务的回滚只会影响到当前事务.
例: 循环10次调用新增.
第二次需要回滚,那么只有第二条数据没有插入,其它得数据还是插入了的.
如果是需要细化的事务级别的话.不能够抛出异常停止事务,因为这样的话,会导致后面的循环不再执行了.
如果执行到需要回滚的代码.并且不希望继续执行本次循环的后面的代码,但是希望执行下次循环.
那么直接return就行.下次调用依旧会进来,程序依旧会继续执行.

这些东西要作为一个参考.心得.忘得时候有个佐证.

我做了一个小实验:
写了两个方法,分别加事务. AB,接口中顺序调用AB
1A回滚,B不回滚. 正常.
2:A不回滚,B回滚. 正常.
3: AB都不回滚,正常.
4: AB都回滚,正常.

事务只影响本方法. 且相互独立.
即使是在一个接口中,顺序调用.
也可以根据方法来控制事务的粒度.
这是对上述循环的事务的一个延申. 而且很有意义.

首先,一个接口中我对两个第三方做处理.
就需要对事务进行单独的管理.
情况:
A表对应一个三方.
B表对应一个三方.
仅有A的三方失败了,那我只回滚A表,并不回滚B表
这样的话,可以避免重复操作.可以避免逻辑耦合.

同一个类中为什么事务会失效?
因为没有代理.所以切面的注解不起作用.
注释是,生成一个带有事务的代理类. 没有使用代理类,类本身是不包含事务的.
解决方法:
注入当前类,使用注入的类进行调用.
原因:注入的类是spring 容器管理的代理类.是有事务注解的.
我没有使用当前类.
我是使用了当前类的实现的接口进行注入.
然后使用注入的接口调用方法.
结果是生效了的.
这就证明容器管理的代理类接口,对应管理的是容器管理的代理实现类.
所以包含有事务注解.

事务之手动回滚:
今天没有多事务,而是涉及到一个单独的事务,手动回滚.
场景:
a方法开启了事务,调用了b方法.在b方法中写了手动回滚的代码.
疑问: b方法中的手动回滚代码是否能够对数据进行正常的回滚.
产生疑惑的原因: b方法上没有打事务注解.不知道a方法加注解是否能影响到b方法.
结果: 进行了测试,确实是能够进行回滚的.
思考:
结合以前的经验来看.
上级开启了事务,其本身包括其下的所有调用方法都会有该事务.
如果想要被调用方法不受此事务的影响.或者有一个单独的事务.
解决的办法就是给其开一个单独的事务.让此方法内的事务独立.
嗯,稳.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值