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();语句,手动回滚,这样上层就无需去处理异常

  • 相关阅读:
    Flink中的window、watermark和ProcessFunction(三)
    ThreadLocal刨根问底
    Flink的流处理API(二)
    Flink简介(一)
    SparkStreaming
    SparkSQL
    Spark入门
    SparkCore
    【HNOI2009】 最小圈
    【BOI 2002】 双调路径
  • 原文地址:https://www.cnblogs.com/ming-blogs/p/10288951.html
Copyright © 2011-2022 走看看