文章目录
1.非public修饰的方法
@Transactional注解只能在public修饰的方法下使用,因为spring aop实现事务时,判断了当前代理方法是否为public修饰。
@Transactional
private boolean test(){
//do something
}
2.类内部访问
类内部非直接访问带注解标记的方法 B,而是通过类普通方法 A,然后由 A 调用 B
@Service
public class Demo {
public void A() {
this.B();
}
@Transactional
public void B() {
......
}
}
3.数据库存储引擎不支持事务
MySQL中,MyISAM存储引擎不支持事务,InnoDB支持事务
4.异常类型不匹配
@Transactional注解默认处理运行时异常,非运行时异常需要通过rollbackFor属性指定。
/**
* 非运行异常,且没有通过 rollbackFor 指定抛出的异常,不生效
* @param id
* @return
* @throws Exception
*/
@Transactional
public boolean testException(int id) throws Exception {
//运行代码
throw new Exception("参数异常");
}
5.异常捕获未抛出
方法内部的异常通过try catch捕获并处理了,未抛出
@Transactional
public void A(){
try{
......
}catch(Exception e){
// 未抛异常
}
}
6.Bean没有纳入Spring容器管理
7.事务方法内启动新线程进行异步操作
8.传播属性设置为不走事务
@Transactional默认的事务传播机制是:REQUIRED,若指定成了NOT_SUPPORTED、NEVER事务传播机制,则事物不生效