Spring 学习笔记 - @Transactional 失效场景
Posted 笑虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 学习笔记 - @Transactional 失效场景相关的知识,希望对你有一定的参考价值。
Spring 学习笔记 - @Transactional 失效场景
1 私下交易(同一个类调用)
@Transactional
是AOP实现的,具体手段就是动态代理,而Spring
中同一个类内的方法互相调用不走代理对象。自然也就不触发事务了。
public class A
public void a()
b();
@Transactional
public void b()
...
解决方案 1
将 a
、b
方法拆分到两个类。
解决方案 2
避免私下交易,从Spring
容器拿到代理对象
再调用方法
。
public class A
@Resource
private ApplicationContext ctx;
public void a()
ctx.getBean(this.getClass()).b();
@Transactional
public void b()
...
2 固步自封(访问修饰符 private)
把方法a
的访问修饰符改成public
即可。
public class A
private void a()
...
3 分道扬镳(不同的数据源)
mapper1
和 mapper2
分别对应两个不同的数据源,报错互不香干。
如果需要支持多数据源事件。请。。。。。。(我还没试过)
public class A
@Transactional
private void a()
mapper1.add;
mapper2.add();
4 暗号对不上(异常类型不对)
可以先换成 Exception
保底调试一下。然后再根据需要缩小异常范围。
@Transactional(rollbackFor=Exception.class)
5 欺上瞒下(try catch 私吞异常没上报)
@Slf4j
public class A
public void a()
try
b();
catch(Exception e)
log.error("这事不大,私了吧!不上抛了。");
@Transactional
public void b() ...
6 逆天而行(数据库引擎不支持)
对于mysql:
InnoDB 支持
MyISAM 不支持
参考资料
以上是关于Spring 学习笔记 - @Transactional 失效场景的主要内容,如果未能解决你的问题,请参考以下文章