mybatis 事务回滚配置操作

在mybatis进行批量操作的时候,插入多条数据时,设置回滚但是前面几条还是插入,经过尝试

问题所在:

官网api上openSession(false)就可以回滚了,但是用session.getConnection().getAutoCommit()查看还是true

解决方法:

将DataSource配置改为AutoCommit(false)

将conn设置setAutoCommit(false),用conn进行提交,回滚操作

例子:

SqlSession session = sqlSessionFactory.openSession(false);  Connection conn = session.getConnection();  conn.setAutoCommit(false);  try {   UserMapper mapper = session.getMapper(UserMapper.class);   for (String name : names) {     //各种操作    User user = new User();    user.setName(name);    //插入,需要回滚    mapper.insert(user);   }   conn.commit();  } catch (Exception e) {   //有重复回滚   conn.rollback();   throw e;  } finally {   session.close();  }

补充:Spring Boot + Mybatis Plus手动触发事务回滚

使用第一种方法(省略了操作数据库的代码)操作Mybatis Plus的事务,若出现异常进入catch之后,不会执行数据库操作的回滚,反而会报No transaction aspect-managed TransactionStatus in scope的错误,修改为第二种可以正常进行事务管理和回滚

看到一个关于此情况的解释:

@Transactional 必须触发aop代理才能生效,故非public方法,不执行事务,public方法在本类中被引用,也不执行事务

第一种方法:

@PostMapping("/save1")public boolean action01() { return action00(); } @PostMapping("/save2")public boolean action02() { return action00(); } @Transactionalprivate boolean action00() { String result = true; try {  System.out.println(1/0); } catch (Exception e) {  TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();  result = false; } return result;}

​ 第二种方法:

@PostMapping("/save1")@Transactionalpublic boolean action01() { boolean result = action00(); if (!result){  TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } return result; } @PostMapping("/save2")@Transactionalpublic boolean action02() { boolean result = action00(); if (!result){  TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } return result; }  private boolean action00() { String result = true; try {  System.out.println(1/0); } catch (Exception e) {  result = false; } return result;}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。

但一定要背上几本书,在花海里,草丛旁悠然品味,

mybatis 事务回滚配置操作

相关文章:

你感兴趣的文章:

标签云: