MyBatis事务回滚例子 - 极悦
专注Java教育14年 全国咨询/投诉热线:444-1124-454
极悦LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 MyBatis事务回滚例子

MyBatis事务回滚例子

更新时间:2022-03-23 10:10:32 来源:极悦 浏览2275次

mybatis批量操作中,插入多条数据时,设置回滚,但是之前的几条还是插入的。尝试后

问题是:

官网api上的openSession(false)可以回滚,但是用session查看还是可以的。获取连接()。获取自动提交 ()

解决方案:

将 DataSource 配置更改为 AutoCommit (false)

设置setAutoCommit(false)为conn,用conn提交和回滚

例子:

SqlSession session = sqlSessionFactory.openSession(false);
  Connection conn = session.getConnection();
  conn.setAutoCommit(false);
  try {
   UserMapper mapper = session.getMapper(UserMapper.class);
   for (String name : names) {
     // Various operations 
    User user = new User();
    user.setName(name);
    // Insert, require rollback 
    mapper.insert(user);
   }
   conn.commit();
  } catch (Exception e) {
   // There are repeated rollbacks 
   conn.rollback();
   throw e;
  } finally {
   session.close();
  }

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

使用第一种方法(省略数据库操作的代码)操作Mybatis Plus的事务,如果有异常进入catch,数据库操作不会回滚,但是会报No transaction aspect-managed TransactionStatus in scope的错误改为报告。修改为第二种方法可以正常管理和回滚事务

请参阅此情况的说明:

@Transactional必须触发aop代理才能生效,所以非公有方法不执行事务,而公有方法在该类中被引用不执行事务

方法一:

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

方法二:

@PostMapping("/save1")
@Transactional
public boolean action01() {
 boolean result = action00();
 if (!result){
  TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 }
 return result; 
} 
@PostMapping("/save2")
@Transactional
public 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;
}

 

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>