zoukankan      html  css  js  c++  java
  • @Transactional事务不起作用原因

    想必也有人遇到@Transactional事务不起作用,当时我遇到这个问题也很懵逼,明明别人的代码跟自己的一样,为什么别人的@Transactional事务起作用而自己的事务却没有起作用。如下举例子说明:
    student1与student2要么全部录入成功,要么全部录入失败,但是我当时遇到的就是student1可以录入成录入功但是student2录入失败(故意把student2信息修改成录入错误的)。
    @Service
    public class StudentService {
    @Autowired
    private StudentRespository studentRespository;

    1. @Transactional
    2. public void insertTwo(){
    3. Student student1=new Student();
    4. student1.setName("n");
    5. student1.setAge(20);
    6. student1.setSex("nv");
    7. studentRespository.save(student1);
    8. Student student2=new Student();
    9. student2.setName("name2");
    10. student2.setAge(20);
    11. student2.setSex("nan");
    12. studentRespository.save(student2);
    13. }

    }
    经过一番折腾最后找到了原因,是因为数据库不支持事务,如果遇到这个问题首先去看看数据库是否支持事务管理。MySql举例子:Mysql修改支持事务的方法,

    把引擎(也就是表类型)修改为InnoDB就ok了,在进行测试,事务起作用了。

    下面方法供大家参考,楼主并未进行验证。
    方案一:手动回滚。给注解加上参数如:@Transactional(rollbackFor=Exception.class)
    方案二:如上述分析。MyException改为继承RuntimeException的异常。并且在service上层要继续捕获这个异常并处理
    方案三:在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常

  • 相关阅读:
    莎士比亚名言
    庄子名言
    Javascript: 通过图片url获取图片blob对象
    toast提示 封装
    maya模型导入UE4,如何做到等比导入
    GPU渲染和CPU渲染农场成本对比
    C4D渲线框
    C4D教程笔记——高科技线框3D模型全息投影 X-Wing Hologram Animation
    arnold和redshift渲染器
    使用Redshift渲染器,怎么选电脑配置!
  • 原文地址:https://www.cnblogs.com/ming-blogs/p/10288951.html
Copyright © 2011-2022 走看看