一、事务配置正确的前提下,出现事务不起作用的原因:
异常被try{}catch(){}捕捉到了,有异常就不会回滚。
使用@Transactional注解注意事项:
当本类的使用@Transactional的方法被本类的其它没有开启事务的方法调用时,不会开启事务。
使用@Transactional的方法被其它类调用时,按照正常的事务传播行为规则开启事务
二、数据库引擎要支持事务
如果是mysql,注意表要使用支持事务的引擎,比如innodb,如果是myisam,事务是不起作用的
是否开启了对注解的解析
配置文件必须加<tx:annotation-driven />,否则不解析@Transactional
case:
// 自动回滚
@Transactional(rollbackFor = Exception.class)
public void asyncJob() throws Exception {
success();
// 假如exception这个操作数据库的方法会抛出异常,方法success()对数据库的操作会回滚
exception();
}
// 手动回滚(进行try/catch,回滚并抛出)
@Transactional(rollbackFor = Exception.class)
public void asyncJob1() {
success();
try {
exception();
} catch (Exception e) {
e.printStackTrace();
//手工回滚异常
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
// 回滚部分异常
@Transactional(rollbackFor = Exception.class)
public void asyncJob2() {
success();
//设置回滚点,只回滚以下异常
Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
try {
exception();
} catch (Exception e) {
e.printStackTrace();
//手工回滚异常,回滚到savePoint
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
}
}