在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;
}

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