From 5a44269f131fd78d927989987f549a61d47b1600 Mon Sep 17 00:00:00 2001 From: Mingron <41795715+1autodidact@users.noreply.github.com> Date: Thu, 10 Mar 2022 22:44:23 +0800 Subject: [PATCH 1/2] =?UTF-8?q?spring=20=E4=BA=8B=E5=8A=A1=20PROPAGATION?= =?UTF-8?q?=5FNESTED=E7=BA=A0=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ROPAGATION_NESTED:如果当前存在事务,就在嵌套事务内执行;如果当前没有事务,就执行与PROPAGATION_REQUIRED类似的操作,子事务回滚外部主事务也会受到影响进行回滚 ``` @service public class UserInvokeService { @Autowired private UserService userService; @resource private UserMapper userMapper; @transactional public void invokeUserService() { User user = new User(); user.setName("zxx"); user.setAge(333333); userMapper.insert(user); userService.insertData(); } } @service public class UserService { @resource private UserMapper userMapper; @transactional(propagation = Propagation.NESTED) public void insertData() { User user = new User(); user.setName("inserByNested"); user.setAge(2222); userMapper.insert(user); int a = 1 / 0; } } @SpringBootTest public class TransactionalTest { @Autowired UserService userService; @Autowired UserInvokeService userInvokeService; @test public void testTransaction() { userInvokeService.invokeUserService(); } } ``` --- .../framework/spring/spring-transaction.md | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/docs/system-design/framework/spring/spring-transaction.md b/docs/system-design/framework/spring/spring-transaction.md index 4be94772..cd9db83b 100644 --- a/docs/system-design/framework/spring/spring-transaction.md +++ b/docs/system-design/framework/spring/spring-transaction.md @@ -393,14 +393,13 @@ Class B { **3.`TransactionDefinition.PROPAGATION_NESTED`**: -如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于`TransactionDefinition.PROPAGATION_REQUIRED`。也就是说: - -1. 在外部方法未开启事务的情况下`Propagation.NESTED`和`Propagation.REQUIRED`作用相同,修饰的内部方法都会新开启自己的事务,且开启的事务相互独立,互不干扰。 -2. 如果外部方法开启事务的话,`Propagation.NESTED`修饰的内部方法属于外部事务的子事务,外部主事务回滚的话,子事务也会回滚,而内部子事务可以单独回滚而不影响外部主事务和其他子事务。 +如果当前存在事务,就在嵌套事务内执行;如果当前没有事务,就执行与`TransactionDefinition.PROPAGATION_REQUIRED`类似的操作。也就是说: +1. 在外部方法开启事务的情况下,在内部开启一个新的事务,作为嵌套事务存在。 +2. 如果外部方法无事务,则单独开启一个事务与 PROPAGATION_REQUIRED 类似 这里还是简单举个例子: -如果 `aMethod()` 回滚的话,`bMethod()`和`bMethod2()`都要回滚,而`bMethod()`回滚的话,并不会造成 `aMethod()` 和`bMethod()2`回滚。 +如果 `bMethod()` 回滚的话,`aMethod()`也会回滚。 ```java Class A { @@ -409,7 +408,6 @@ Class A { //do something B b = new B(); b.bMethod(); - b.bMethod2(); } } @@ -418,12 +416,7 @@ Class B { public void bMethod { //do something } - @Transactional(propagation=propagation.PROPAGATION_NESTED) - public void bMethod2 { - //do something - } } -``` **4.`TransactionDefinition.PROPAGATION_MANDATORY`** From 3ac727a98aedf4edb7ab0fef96f16fa41c3c1f80 Mon Sep 17 00:00:00 2001 From: Mingron <41795715+1autodidact@users.noreply.github.com> Date: Thu, 10 Mar 2022 22:52:53 +0800 Subject: [PATCH 2/2] Update spring-transaction.md --- docs/system-design/framework/spring/spring-transaction.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/system-design/framework/spring/spring-transaction.md b/docs/system-design/framework/spring/spring-transaction.md index cd9db83b..d30269d3 100644 --- a/docs/system-design/framework/spring/spring-transaction.md +++ b/docs/system-design/framework/spring/spring-transaction.md @@ -417,6 +417,7 @@ Class B { //do something } } +``` **4.`TransactionDefinition.PROPAGATION_MANDATORY`**