好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

mybatis 事务回滚配置操作

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

问题所在:

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

解决方法:

将DataSource配置改为AutoCommit(false)

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

例子:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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方法在本类中被引用,也不执行事务

第一种方法:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

@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;

}

​ 第二种方法:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

@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;

}

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

原文链接:https://blog.csdn.net/weixin_40364421/article/details/87625461

查看更多关于mybatis 事务回滚配置操作的详细内容...

  阅读:17次