From d2ce6448f5e4866cfec05c6da3c98f204b1d62ae Mon Sep 17 00:00:00 2001 From: JoeyChan Date: Sun, 16 Feb 2025 14:45:03 +0800 Subject: [PATCH] =?UTF-8?q?[doc=20perf]=E4=BC=98=E5=8C=96=E4=BA=8B?= =?UTF-8?q?=E5=8A=A1=E4=BC=A0=E6=92=AD=E8=A1=8C=E4=B8=BA=E4=B8=ADTransacti?= =?UTF-8?q?onDefinition.PROPAGATION=5FNESTED=E7=9A=84=E8=A7=A3=E9=87=8A?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/system-design/framework/spring/spring-transaction.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/system-design/framework/spring/spring-transaction.md b/docs/system-design/framework/spring/spring-transaction.md index b294d6f6..c9358ab2 100644 --- a/docs/system-design/framework/spring/spring-transaction.md +++ b/docs/system-design/framework/spring/spring-transaction.md @@ -419,11 +419,16 @@ Class B { **3.`TransactionDefinition.PROPAGATION_NESTED`**: -如果当前存在事务,就在嵌套事务内执行;如果当前没有事务,就执行与`TransactionDefinition.PROPAGATION_REQUIRED`类似的操作。也就是说: +如果当前存在事务,则创建一个事务作为当前事务的嵌套事务执行; 如果当前没有事务,就执行与`TransactionDefinition.PROPAGATION_REQUIRED`类似的操作。也就是说: - 在外部方法开启事务的情况下,在内部开启一个新的事务,作为嵌套事务存在。 - 如果外部方法无事务,则单独开启一个事务,与 `PROPAGATION_REQUIRED` 类似。 +`TransactionDefinition.PROPAGATION_NESTED`代表的嵌套事务以父子关系呈现,其核心理念是子事务不会独立提交,依赖于父事务,在父事务中运行;当父事务提交时,子事务也会随着提交,理所当然的,当父事务回滚时,子事务也会回滚; +> 与`TransactionDefinition.PROPAGATION_REQUIRES_NEW`区别于:`PROPAGATION_REQUIRES_NEW`是独立事务,不依赖于外部事务,以平级关系呈现,执行完就会立即提交,与外部事务无关; + +子事务也有自己的特性,可以独立进行回滚,不会引发父事务的回滚,但是前提是需要处理子事务的异常,避免异常被父事务感知导致外部事务回滚; + 举个例子: - 如果 `aMethod()` 回滚的话,作为嵌套事务的`bMethod()`会回滚。 - 如果 `bMethod()` 回滚的话,`aMethod()`是否回滚,要看`bMethod()`的异常是否被处理: