引言
@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 失效的场景远不止这三种,上面总结的只是我在项目中常出现的应用,总结不到位的地方,望谅解
文章介绍了@Transactional注解在Java开发中的使用,特别是它在哪些情况下可能失效:非public方法上无效,被try-catch且未抛出异常,以及在同一类内部调用的方法。此外,强调只有当事务方法被类外部调用时,Spring才会管理并使@Transactional生效。
1492

被折叠的 条评论
为什么被折叠?



