事务伝播#
事务伝播のいくつかのケース#
番号 | 事务の伝播メカニズム | 説明 | 備考 |
---|---|---|---|
1 | required | 現在のトランザクションが存在する場合は、そのトランザクションに参加します。 現在のトランザクションが存在しない場合は、新しいトランザクションを作成します。 これが最も一般的な設定です。 | トランザクションを作成します。 |
2 | requires_new | トランザクションの有無に関係なく、新しい独自のトランザクションを作成します。古いトランザクションは一時停止し、新しいトランザクションが実行されてコミットされた後、古いトランザクションが再開されて最後にコミットされます。 | 1. 新しいトランザクションを常に作成します。 2. 新しいトランザクションを作成する前に、古いトランザクションを一時停止します。 3. 最初に実行されたメソッドはトランザクションを後でコミットし、後に実行されたメソッドはトランザクションを先にコミットします。 4. 古いトランザクションのロールバックは、新しいトランザクションのコミットに影響しません。 |
3 | nested | 現在のトランザクションが存在する場合、ネストされたトランザクションは外部のトランザクションと同じトランザクションを使用しますが、内部のネストでは新しいセーブポイント( savepoint )が作成され、次の 2 つの場合に実行されます: (1)ネストされた内部でロールバックが発生した場合、外部のトランザクションの正常なコミットに影響しません。 (2)外部のトランザクションでロールバックが発生した場合、ネストされた内部のトランザクションもロールバックされます。 (3)例外が発生しない場合、ネストされた内部のトランザクションと外部のトランザクションは一緒にコミットされます。現在のトランザクションが存在しない場合は、required と同様の操作が実行されます。 | 皮は残っているが、毛は焼かれている。 皮がなくなると、毛はどこにつくのか。 |
4 | supports | 現在のトランザクションをサポートします。 現在のトランザクションが存在する場合は、そのトランザクションに参加し、 現在のトランザクションが存在しない場合は、非トランザクションで実行します。 | supports はトランザクションを作成しません。 |
5 | not_supported | トランザクションをサポートしません。 現在のトランザクションが存在する場合は、現在のトランザクションを一時停止します。 現在のトランザクションが存在しない場合は、非トランザクションで実行します。 | |
6 | mandatory | トランザクションを強制的に使用します。 現在の トランザクションが既に存在する場合は、そのトランザクションに参加し、 現在のトランザクションが存在しない場合は、例外をスローします。 | 1. mandatory はトランザクションを作成しません。 2. mandatory の実行条件は既にトランザクションが存在することです。 |
7 | never | トランザクションを禁止します。 現在のトランザクションが存在する場合は、例外をスローします。 現在のトランザクションが存在しない場合は、非トランザクションで実行します。 | トランザクションがない状態で実行する必要があります。そうでない場合、エラーが発生します。 |
事务伝播のいくつかのケースの理解#
動作 | タイプ |
---|---|
あれば参加、なければ無視 | supports |
外側があっても新しいトランザクションである必要がある | requires_new |
外側があれば参加、なければ新しいトランザクション | required |
外側があれば参加、セーブポイントを追加、なければ新しいトランザクション | nested |
トランザクションは必要ない、外側があれば一時停止 | not_supported |
トランザクションが必要(条件を満たさない場合は例外) | mandatory |
トランザクションが不要(条件を満たさない場合は例外) | mandatory |
スレッドバインディング(同期管理)#
この記事は Mix Space から同期更新され、xLog に掲載されています。
元のリンクは https://me.liuyaowen.club/posts/default/Spring です。