mybatis 事务回滚配置操作

 更新时间:2021年02月23日 11:12:27   作者:xmaaaa  
这篇文章主要介绍了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(); 
}
 
@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;
}

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

相关文章

  • Java中的相除(/)和取余(%)的实现方法

    Java中的相除(/)和取余(%)的实现方法

    这篇文章主要介绍了Java中的相除(/)和取余(%)的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Mybatis基于注解形式的sql语句生成实例代码

    Mybatis基于注解形式的sql语句生成实例代码

    这篇文章主要介绍了 Mybatis基于注解形式的sql语句生成实例代码,需要的朋友可以参考下
    2017-09-09
  • 用Java实现小球碰壁反弹的简单实例(算法十分简单)

    用Java实现小球碰壁反弹的简单实例(算法十分简单)

    下面小编就为大家带来一篇用Java实现小球碰壁反弹的简单实例(算法十分简单)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Java实现的计算最大下标距离算法示例

    Java实现的计算最大下标距离算法示例

    这篇文章主要介绍了Java实现的计算最大下标距离算法,涉及java针对数组的遍历、运算等相关操作技巧,需要的朋友可以参考下
    2018-02-02
  • Java使用二分法进行查找和排序的示例

    Java使用二分法进行查找和排序的示例

    这篇文章主要介绍了Java使用二分法进行查找和排序的示例,二分插入排序和二分查找是基础的算法,需要的朋友可以参考下
    2016-04-04
  • Spring实战之设置普通属性值的方法示例

    Spring实战之设置普通属性值的方法示例

    这篇文章主要介绍了Spring实战之设置普通属性值的方法,结合实例形式分析了Spring设置普通属性值的方法及相关操作注意事项,需要的朋友可以参考下
    2019-11-11
  • SpringBoot激活profiles的几种方式

    SpringBoot激活profiles的几种方式

    多环境是最常见的配置隔离方式之一,可以根据不同的运行环境提供不同的配置信息来应对不同的业务场景,这篇文章主要介绍了SpringBoot激活profiles的几种方式,需要的朋友可以参考下
    2019-10-10
  • Java 线程状态和等待唤醒机制和线程池的实现

    Java 线程状态和等待唤醒机制和线程池的实现

    这篇文章主要介绍了Java 线程状态和等待唤醒机制和线程池的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • mybatis plus怎么忽略映射字段

    mybatis plus怎么忽略映射字段

    这篇文章主要介绍了mybatis plus怎么忽略映射字段,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • java中BigDecimal的操作方法

    java中BigDecimal的操作方法

    这篇文章主要介绍了java中BigDecimal的操作方法,较为详细的分析了BigDecimal类在进行商业计算时的应用方法,精度以及注意事项等问题,需要的朋友可以参考下
    2014-12-12

最新评论