事物失效的8种情况及解决办法
事物失效的8种情况及解决办法
数据库引擎不支持事务
这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB,这时候选择支持事物的数据库即可(好像是废话,哈哈哈)
没有被 Spring 管理
这个好像没什么可说的,脱离了Spring的管理,还谈什么Spring事物管理。
方法不是 public 的
@Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。
数据源没有配置事务管理器
相当于没开启事务管理,如果不是Springboot情况需要进行如下操作。
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
如果是SpringBoot,在启动类上直接加上注解@EnableTransactionManagement即可。
传播特性配错了
传播特性配置成,Propagation.NOT_SUPPORTED或者Propagation.NOT_SUPPORTED,改成支持事物的传播特性即可。
异常类型错误
因为默认的异常类型是运行时异常,如果抛出了其他异常就不生效。
解决方式:
1、将异常改成运行时异常
2、指定异常进行事物回滚,如:@Transactional(rollbackFor = Exception.class)
异常被吃掉了
如果你代码这么写,事物不生效:
@Transactional(rollbackFor = Exception.class)
public void updateUser2() {
try {
int r1 = userInfoDAO.updateUserName(1,"3");
int r2 = userInfoDAO.updateUserName(2,"4");
if (r2==1){
throw new RuntimeException();
}
}catch (Exception e){
}
}
解决办法: 必须要抛出异常,否则Spring事务管理,不会走到回滚逻辑
类内部调用
@Service
public class UserInfoService {
public void justUpdate(){
updateUser2();
}
@Transactional(rollbackFor = Exception.class)
public void updateUser2() {
}
}
上述代码不生效,因为内部调用不会涉及到代理类的调用,更不会有AOP的增强,因此不会生效。
解决办法:
1、自注入
@Service
public class UserInfoService {
@Autowired
private UserInfoService userInfoService;
public void justUpdate(){
userInfoService.updateUser2();
}
@Transactional(rollbackFor = Exception.class)
public void updateUser2() {
}
}
2、Spring上下文
@Service
public class UserInfoService {
ApplicationContext applicationContext;
public void justUpdate(){
UserInfoService userInfoService = (UserInfoService) applicationContext.getBean("userInfoService");
userInfoService.updateUser2();
}
@Transactional(rollbackFor = Exception.class)
public void updateUser2() {
}
}
3、获取他的代理类,直接调用代理类
@Service
public class UserInfoService {
public void justUpdate(){
((UserInfoService) AopContext.currentProxy()).updateUser2();
}
@Transactional(rollbackFor = Exception.class)
public void updateUser2() {
}
}
\
因为相信,所以看见.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)