引言
@Transactional注解相信大家都不陌生,在开发中经常使用保证程序可以要么同时成功要么同时失败。但是很多小伙伴只会使用,而不知道在什么场景下失败。今天就介绍下会失败的场景和原因,主要针对失败回滚,其他类型的错误类型这里不做介绍。 @Transactional(rollbackFor = Exception.class)。
使用的场景
只介绍类和方法,其他的不介绍(比如接口)。@Transactional可以放在类上时,表示所有该类的public方法都配置相同的事务属性信息。当放到方法上时如果类上也加了注解,方法的注解会覆盖类上的。
失效的场景(只针对失败回滚这种类型)
1.@Transactional不能用在非public修饰的方法上
protected TransactionAttribute computeTransactionAttribute(Method method,
Class<?> targetClass) {
// 判断了方法是否是public修饰
if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
return null;
2.方法被try-- catch 捕获了,并且没把异常抛出去
3.比如有个用户user类,里面有一个a方法,一个b方法,b方法加了@Transactional,如果这时候在a方法调用b方法是不会生效的。原因是因为只有事务方法被当前类以外的代码调用时,才会被Spring管理,让@Transactional生效
//这两个方法是同一个类,因为shiwu方法是在自己类被调用的所以注解不会生效
@Override
public Long shiwuUpdate() {
shiwu();
return 1L;
}
@Transactional(rollbackFor = Exception.class)
public void shiwu() {
userMapper.update("张三");
int i = 1/0;
}
总结
@Transactional 失效的场景远不止这三种,上面总结的只是我在项目中常出现的应用,总结不到位的地方,望谅解