Spring 学习笔记 - @Transactional 失效场景

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 学习笔记 - @Transactional 失效场景相关的知识,希望对你有一定的参考价值。

1 私下交易(同一个类调用)

@Transactional是AOP实现的,具体手段就是动态代理,而Spring中同一个类内的方法互相调用不走代理对象。自然也就不触发事务了。

public class A
	public void a()
		b();
	

	@Transactional
	public void b()
		...
	

解决方案 1

ab方法拆分到两个类。

解决方案 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 分道扬镳(不同的数据源)

mapper1mapper2 分别对应两个不同的数据源,报错互不香干。
如果需要支持多数据源事件。请。。。。。。(我还没试过)

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 不支持

参考资料

使用 @Transactional 时常犯的N种错误

以上是关于Spring 学习笔记 - @Transactional 失效场景的主要内容,如果未能解决你的问题,请参考以下文章

Spring学习笔记

最新最全面的Spring详解——事务管理

spring学习笔记 Spring概述

Spring学习笔记

Spring之004: jdbcTemplate基本使用Spring实物控制

高质量Spring实战学习笔记,腾讯内部学习Spring首推