レイマンの用語におけるばね伝播の例
-
02-01-2020 - |
質問
Spring Docs をするトランザクション伝播プロパティを記述する素晴らしい仕事
しかし、私は、レイマンの用語でこれらのプロパティのそれぞれをより徹底的に説明する、よく知られている実世界の例があるかどうか疑問に思いましたか?
解決
propagation_required
class Service {
@Transactional(propagation=Propagation.REQUIRED)
public void doSomething() {
// access a database using a DAO
}
}
.
呼び出し側が既にトランザクションを起動していない場合、それは新しいトランザクションを開始します。
このメソッドの呼び出し元がすでにトランザクションを開始している場合、発信者のトランザクションが使用され、新しいトランザクションは作成されません(すなわち、Playに1つのトランザクションがある)。
DoSomething()の内部に例外がスローされている場合はロールバックされます。つまり、呼び出し元はトランザクションがロールバックされているのを見ることを意味します。
Dosomething()が返されたとき、トランザクションはまだコミットされませんでした。トランザクションをコミットする発信者です(またはおそらくロールバック)。
propagation_requires_new
class Service {
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void doSomething() {
// access a database using a DAO
}
}
.
DOSOMECHET()が呼び出されると、常にの新しいトランザクションを開始します。
このメソッドの呼び出し元がすでにトランザクション(txnouter)を開始している場合、呼び出し元のトランザクションは suspended です。新しいトランザクション(Txninner)が作成されます(つまり、Playには2つのトランザクションがあります)。
DoSomething()内に例外がスローされている場合、Txninnerはロールバックされますが、発信者からの「中断」トランザクション(TXNOUTER)は影響を受けません。
dosomething()が例外なしで戻ると、トランザクション(Txninner)をコミットします。発信者のトランザクション(TXNOUTER)は再開され、別のトランザクションがコミットされたことを認識されません。それは、それが合うように見えるように呼び出し側をコミットまたはロールバックすることができます。
注意事項注意事項は、データベースビューTXNOUTERとTXNINNERが完全に独立したトランザクションとして、したがって2つの独立したコミットをコミットすることです。
propagation_nested
class Service {
@Transactional(propagation=Propagation.NESTED)
public void doSomething() {
// access a database using a DAO
}
}
.
ネストしたJDBCドライバやデータベースがサポートされている場合にのみ使用できます。 >
呼び出し側が既にトランザクションを起動していない場合、それは新しいトランザクションを開始します。
DoSomething()内に例外がスローされた場合、トランザクションはトランザクションを "SavePoint"にロールバックすることができます。発信者はトランザクションを続行します。