欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mybatis 事务回滚配置操作

程序员文章站 2022-03-08 23:16:52
在mybatis进行批量操作的时候,插入多条数据时,设置回滚但是前面几条还是插入,经过尝试问题所在:官网api上opensession(false)就可以回滚了,但是用session.getconne...

在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(); 
}
 
@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;
}

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