1. 类内部调用同一个类中其它的public方法,这种情况事务是不生效的; 在AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断,如果目标方法不是public,则TransactionAttribute返回null,即不支持事务。
2. private protected方法;
3. mysql存储引擎必须是InnoDB, 或者其它支持事务的存储引擎,MyIsam是不支持事务的;
4. 确保事务和业务在同一个线程里面;
在一个事务方法A里面,业务逻辑另外起一个线程,那么这个线程是不受方法A事务控制的;
.....
@Transactional
public void methodB() {
Runnable r = new Runnable() {
}
r.start();
}
在一个非事务方法里面,调用相同类下面事务方法B, 那么方法B事务也不会生效;
.....
public void methodA() {
methodB();
}
@Transactional
public void methodB() {
.....
}
.....
5. 方法内部catch住了异常,也会导致事务不回滚;
6. 方法用final修饰;
疑问:
如何获取代理类
java异常(Exception, error, throwable):
非检查异常(RuntimeException派生的类) 编译时不需要检查
检查异常 编译时需要检查 (检查异常事物要生效: rollBackFor=Exception.class)
Exception分类:
运行时异常
非运行时异常
事物传播行为, 用propagation参数.
该参数的作用是指定事务的传播特性,spring目前支持7种传播特性:
REQUIRED 如果当前上下文中存在事务,那么加入该事务,如果不存在事务,创建一个事务,这是默认的传播属性值。
SUPPORTS 如果当前上下文存在事务,则支持事务加入事务,如果不存在事务,则使用非事务的方式执行。
MANDATORY 如果当前上下文中存在事务,否则抛出异常。
REQUIRES_NEW 每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行。
NOT_SUPPORTED 如果当前上下文中存在事务,则挂起当前事务,然后新的方法在没有事务的环境中执行。
NEVER 如果当前上下文中存在事务,则抛出异常,否则在无事务环境上执行代码。
NESTED 如果当前上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。
参考:
常见Spring事务失效原理解析_spring声明式事务失效-CSDN博客
Spring事务@Transactional注解rollbackFor属性注意事项_@transactional(rollbackfor =-CSDN博客