春の繁殖行動総務の7種類

トランザクション伝播の挙動

「トランザクション伝播の動作は、」説明されています取引方法は、別のメソッドを呼び出すと、どのように取引方法?

これは、新しいトランザクションを作成するのですか?廃棄業務?それとも、既存のトランザクションに追加しますか?

このような状況のため、春Frameworkは7トランザクション伝播の振る舞いを定義し、開発者は、実際のビジネスシナリオに基づいて、適切な繁殖行動を選択することができます。

トランザクション伝播の振る舞いの7種類

クラス列挙体で定義された春Propagation、次のとおりです。

  • REQUIRED
    トランザクションが現在開いていない場合は、トランザクションが現在開いている場合、トランザクション、デフォルトの動作に入社し、新しいトランザクションを開きます。
  • 支持体は
    、現在開いているトランザクション場合は、そうでない場合は非トランザクション、トランザクションに参加しました。
  • MANDATORY
    現在開いているトランザクションの場合、トランザクションに参加した、または例外がスローされます。端的に言えば、非トランザクションの実行を許可していませんが、トランザクションを強制。
  • REQUIRES_NEW
    トランザクションは、現在、現在のトランザクション・サスペンション開いている場合は、常に、新しいトランザクションを作成します。
  • NOT_SUPPORTEDは、
    現在のトランザクションが再び開き、現在のトランザクションの実行を中断する場合は、非トランザクションを実行するために余儀なくされました。
  • NEVER
    非トランザクションの実行、現在開いているトランザクションの例外がスローされます。
  • 入れ子
    現在開いているトランザクションがネストされたトランザクションで実行された場合、またはトランザクションの実行を開きます。

思い出させます

SpringのトランザクションがAOPによって達成プロキシクラスに基づいていますが、有効にするトランザクションを伝播する場合、あなたは春でメソッドを呼び出す必要があり、プロキシクラスを生成し、春は直接呼び出しに、プロキシクラスを高めるのに同じクラスのトランザクションを開くかどうかを判断しますスプリング方法自体は、私たちは、取引を開く手助けすることができません!

例として、トランザクション伝播の動作が有効になりません。
ここに画像を挿入説明

プロキシクラスを呼び出すことがあるため、取引の普及が有効になりますので、別のサービスを呼び出します。
ここに画像を挿入説明

通信行動の例の7種類

必須

Spring默认的事务传播行为,也是用的最多的。
如果当前没有开启事务,就开启一个新事务,如果当前开启了事务,就加入该事务,默认行为。

ここに画像を挿入説明
如上图,save没有开启事务,insert不会回滚,delete开启了事务,delete会回滚。
如果save开启了事务,则delete不会开启新事务,会加入到save的事务中,insert和delete都会回滚。

SUPPORTS

如果当前开启了事务,就加入该事务,否则非事务执行。
ここに画像を挿入説明
如上图,save没有开启事务,delete也不会开启事务,insert和delete操作均不会回滚。
如果save开启了事务,delete会加入到save的事务中,则insert和delete均会回滚。

MANDATORY

如果当前开启了事务,就加入该事务,否则抛出异常。说白了,强制事务,不允许非事务执行。
ここに画像を挿入説明
如上图,save没有开启事务,执行delete()时会抛出异常:
ここに画像を挿入説明
insert成功,delete操作没有执行。
如果save开启了事务,则delete()加入到事务中,不会抛异常。

REQUIRES_NEW

如果当前没有开启事务,则开启一个事务,事务的执行。
如果当前开启了事务,则将当前事务挂起,开启一个新事务,事务的执行。
外层事务和内层事务是互相隔离的,内层事务的提交或回滚不影响外层事务,外层事务的提交或回滚也不影响内层事务。

需要捕获内层方法异常,否则内层方法抛异常,会影响外层事务回滚。

ここに画像を挿入説明
如上图,save开启了事务A,执行delete()时,会将save的事务A挂起,并开启新事务B,delete()执行成功,事务B提交,然后恢复事务A,接着抛出异常,事务A回滚,但是事务B已经提交不会受到影响。
最终delete操作成功,insert操作被回滚。

从控制台的日志也能看见其运行过程:
ここに画像を挿入説明

NOT_SUPPORTED

强制以非事务执行,如果当前开启了事务就将当前事务挂起再执行。
ここに画像を挿入説明
如上图,save开启了事务A,执行delete()时会挂起事务A,然后以非事务的方式执行delete并提交,然后恢复事务A,由于save抛出异常,insert回滚。
结果:insert操作回滚,delete操作成功。

NEVER

非事务执行,如果当前开启了事务则抛出异常。
ここに画像を挿入説明
如上图,由于save开启了事务,导致delete抛出异常:
ここに画像を挿入説明
如果save没有开启事务,则save和delete都会以非事务执行。

NESTED

如果当前没有开启事务,则开启一个新事务,事务的执行。
否则,在当前事务中以嵌套事务的方式执行。
以嵌套事务执行前,会创建一个保存点savePoint,如果方法异常,则回滚到该savePoint,否则等待和外层事务一起Commit。
ここに画像を挿入説明

关于Spring的七种事务传播行为都介绍完了,根据实际应用场景选择需要的事务传播行为即可。

REQUIRES_NEW和NESTED的区别

REQUIRES_NEW和NESTED这两种传播行为比较容易搞混,但其实它俩有本质区别。

在当前已经开启事务的情况下:

REQUIRES_NEW会开启一个和外层事务真正隔离的内层事务,内层方法执行完后,内层事务就已经提交或回滚了,和外层事务是完全隔离的,互不影响的。内层事务结束后,才会恢复外层事务,外层事务继续执行。

NESTED自然と新しいトランザクションを開きませんが、途中でセーブポイントのネストされた実行を作成するには、かどうかに関係なく、トランザクション・ロールバックの内層、一緒に実行されるトランザクションによる最終の外層をコミットします。

公開された100元の記事 ウォン称賛23 ビュー90000 +

おすすめ

転載: blog.csdn.net/qq_32099833/article/details/104010666