文章目录
前言
spring事务是我们java开发过程中会遇到失效的问题.
在这里记录下,如有遗漏欢迎指出
先记录下我们在开发过程会遇到常见的场景
事务失效会可以分类2类:
- 你错误的设置或使用了事务
- 发生错误后没有正确的处理
错误的使用或设置方式
同类方法中的调用(最常见的)
@Service
public class TestService {
public void testTran(){
//其他实现
insertInfo();
}
@Transactional
public void insertInfo(){
//具体的实现
}
}
事务未被Spring管理
//@Service(没有把类纳入spring管理容器)
public class TestService {
@Transactional
public void testTran(){
//具体的方法
}
}
方法修饰符不是public的
@Service
public class TestService {
@Transactional
private testTran(){
//具体的方法
}
}
错误的传播机制
比如你错误的把事务的传播截止设置为NOT_SUPPORTED
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void insertInfo(){
//具体的实现
}
数据库不支持事务
例如我们现在常用的关系型数据库mysql它在InnoDB引擎下是只是事务的,
但是在MyISAM下是不支持事务的.
没有正确的处理回滚
没有向外抛出异常
我们在开发过程中错误的try catch
@Transactional
public void insertInfo(){
try {
//具体的实现
}catch (Exception e){
log.error("保存出错: {}", e);
}
}
捕获异常后抛出新的异常(或自定义异常)
@Transactional
public void insertInfo(){
try {
//具体的实现
}catch (Exception e){
throw new Exception("test");
}
}