解决方法: 改成public修饰。
2.异常被捕获了,没有抛出解决方法: 直接抛出需要回滚的异常,不要try-catch住。
3.方法内部直接调用 代码示例:@Service
public class TestService {
@Autowired
TestMapper testMapper;
public void testA() {
testMapper.testInsert("INSERT INTO `tb_my_test` (`code_id`, `is_show`) VALUES ('1', 1);");
testB();
}
@Transactional(rollbackFor = {BusinessException.class})
public void testB(){
testMapper.testInsert("INSERT INTO `tb_my_test` (`code_id`, `is_show`) VALUES ('2', 2);");
throw new BusinessException("异常");
}
}
以上情况即使抛出异常也无法回滚
解决方法:
@Service
public class TestService {
@Autowired
TestMapper testMapper;
@Autowired
TestService testService;
public void testA() {
testMapper.testInsert("INSERT INTO `tb_my_test` (`code_id`, `is_show`) VALUES ('1', 1);");
// 在内部调用的时候 用testService调用testB()方法 可以实现对testB()回滚
testService.testB();
}
@Transactional(rollbackFor = {BusinessException.class})
public void testB(){
testMapper.testInsert("INSERT INTO `tb_my_test` (`code_id`, `is_show`) VALUES ('2', 2);");
throw new BusinessException("异常");
}
}
注意以上示例只能回滚testB() 无法回滚testA()。
4.新开启一个线程解决方法: 在添加了@Transactional注解的方法中,不要新启一个线程执行插入、更新、删除操作。
5.数据库本身不支持 6.事务传播属性设置错误如果设置以非事务方式运行的传播属性,无法开启事务。
解决方法: 设置适合自己的实际情况的传播属性。
以上就是@Transactional失效的几种场景总结,希望能帮到大家!



