From 34ff28dfcc74f3ece36a46b029bc5b3e9fda6a70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Sun, 23 Jul 2023 12:22:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=B5=8C=E5=A5=97=E4=BA=8B=E5=8A=A1?= =?UTF-8?q?=E4=B8=8B=EF=BC=8C=E4=B8=94=E4=BC=A0=E6=92=AD=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E4=B8=BA=20REQUIRED=20=E6=97=B6=EF=BC=8C=E5=BD=93=E5=AD=90?= =?UTF-8?q?=E4=BA=8B=E5=8A=A1=E6=8A=9B=E5=87=BA=E5=BC=82=E5=B8=B8=E6=97=B6?= =?UTF-8?q?=E5=87=BA=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9Bclose=20#?= =?UTF-8?q?I7N8A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/FlexTransactionManager.java | 8 ++++++++ .../test/controller/AccountController.java | 18 +++++++----------- .../test/service/AccountService.java | 4 ++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionManager.java b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionManager.java index 797b4515..803b304e 100644 --- a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionManager.java +++ b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionManager.java @@ -25,6 +25,7 @@ import org.springframework.transaction.support.DefaultTransactionStatus; /** * MyBatis-Flex 事务支持。 + * @author michael */ public class FlexTransactionManager extends AbstractPlatformTransactionManager { @@ -70,6 +71,13 @@ public class FlexTransactionManager extends AbstractPlatformTransactionManager { TransactionalManager.rollback(transactionObject.currentXid); } + @Override + protected void doSetRollbackOnly(DefaultTransactionStatus status) throws TransactionException { + // 在多个事务嵌套时,子事务的传递方式为 REQUIRED(加入当前事务) + // 那么,当子事务抛出异常时,会调当前方法,而不是直接调用 doRollback + // 此时,不需要做任何处理即可,默认上父级事务进行正常 doRollback 即可。 + } + static class TransactionObject { diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java index 1497cdc7..159b1d5b 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java @@ -82,17 +82,13 @@ public class AccountController { Row row2 = Db.selectOneById(null, "tb_account", "id", 2); System.out.println(">>>>>>> row2: " + row2); -// Account account1 = accountMapper.selectOneById(1L); -// Account account2 = accountMapper.selectOneById(2L); -// -// accountService.update2(); -// -// if (true) { -// throw new IllegalStateException("aaa"); -// } -// -// System.out.println("selectOne >>>> " + account1); -// System.out.println("selectOne >>>> " + account2); + Account account = new Account(); + account.setId(2L); + account.setUserName("haha1111"); + accountMapper.update(account); + + //嵌套事务 + accountService.update2(); return accountMapper.selectOneById(id); } diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/service/AccountService.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/service/AccountService.java index 16a66250..37d5d5b7 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/service/AccountService.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/service/AccountService.java @@ -19,7 +19,6 @@ package com.mybatisflex.test.service; import com.mybatisflex.test.mapper.AccountMapper; import com.mybatisflex.test.model.Account; import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; @@ -32,8 +31,9 @@ public class AccountService { AccountMapper accountMapper; - @Transactional(propagation = Propagation.REQUIRES_NEW) + @Transactional public void update2() { + int x = 1/0; Account account = new Account(); account.setId(2L); account.setUserName("haha");