#创作灵感
在进行编码规范扫描时候,提示
事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。
这里就查阅 @Transactional这个注解
#为什么会提示有问题呢?
我们在实现类上对于增删改上加上@Transactional注解,Spring框架的事务基础架构代码将默认地 只 在抛出运行时和unchecked exceptions时才标识事务回滚
🐂🐂🐂 🐎🐎🐎 ♥♥♥
也就是说,当抛出个RuntimeException
或其子类例的实例时。(Errors
也一样 - 默认地 - 标识事务回滚。)从事务方法中抛出的Checked exceptions将 ****不 被标识进行事务回滚。
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。
#如何解决异常被try{}catch{}了,就不回滚了
比如:下面这样抛异常就不会回滚
@Override
@Transactional
public Json addOrder(TOrderAddReq tOrderAddReq) {
try{
//增删改方法
} catch (Exception e) {
.....
e.printStackTrace();}
// }
return json;
}
解决上面办法是直接手动硬执行
@Override
@Transactional
public Json addOrder(TOrderAddReq tOrderAddReq) {
try{
//增删改方法
} catch (Exception e) {
// 手动硬编码开启spring事务管理
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
e.printStackTrace();
}
return json;
}
或者在catch中抛指定异常
@Override
@Transactional
public Json addOrder(TOrderAddReq tOrderAddReq) {
try{
//增删改方法
} catch (Exception e) {
throw new RuntimeException();
}
return json;
}
#重点来了
@Transactional不做任何配置 默认是对抛出的unchecked异常回滚,checked异常不会回滚,为了让所有异常都会让事务启动可以将 @Transactional配置为 @Transactional(rollbackFor = Exception.class)