mybatis 事务回滚配置操作

2025-05-29 0 68

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;

}

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

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 mybatis 事务回滚配置操作 https://www.kuaiidc.com/108407.html

相关文章

发表评论
暂无评论