知識点:Springネストトランザクション方式

1862 ワード

Springが入れ子になった時、どうやって実現しますか?
実験の時、変な問題がありました.
1、ServiceA.a()方法がServiceB.b()方法を呼び出すと、内層事務の提出とロールバックは、外層事務の提出またはロールバックの影響を受けない.
2、ServiceA.a()メソッドがServiceA.c()メソッドを呼び出した場合、内部事務は正確に提出またはロールバックできない.
 
以下のとおりです
xxServiceA類には、次の2つの方法があります.
 
@Transactional 
method_One() {
    method_Two();
}


@Transactional(propagation = Propagation.REQUIRES_NEW) 
method_Two(){
    //do something
}
 
Creating new transactionのような出力が見つかりませんでした.同じService類の中で、springは新たに新しい事務を作成しません.二つの異なるServiceなら、新しい事務を作成します.
 
xxServiceA類:
@Transactional 
method_One() {
    method_Two();
}
xxServiceB類:
@Transactional(propagation = Propagation.REQUIRES_NEW) 
method_Two(){
    //do something
}
Propgation.REQUIRES_NEW発効によって新しいビジネスが創建されました.
 
事務を働かせて、ミスがあったらロールバックします.注意すべき事項:
第一の場合:同じクラスの一つの方法にネスト方法がない.
方法名に@Transactionalコメントを付ければ、方法内でtry catchを使わないでください.try catchを使う必要があるなら、catchには必ずthrow new RuntimeException()が必要です.そうでないと、事務は機能しません.
第二の場合:同じクラスの方法Aネスト方法B方法Aは@Transationがあり、方法内にtry catchがなく、事務が機能する.方法Aは@Transactionalとtry catchがあり、catchではthrow new RuntimeException()を用いて、事務的に機能します.
第三の場合:同類でない場合、方法Cネスト方法Bに@Transactional注を加え、方法内でtry catchを使用しないでください.try catchを使う必要があるなら、catchには必ずthrow new RuntimeException()が必要です.方法Bの事務は役に立たない.方法Cに@Transactionalの注釈を加えて、方法内でtry catchを使わないでください.try catchを使わなければならないなら、catchにはthrow new RuntimeException()が必要です.この場合、方法Bはどのように書いてもいいです.方法Cの事務は役に立たない.
 
 
記事の転載先:https://blog.csdn.net/m0_37701381/articale/detail/85066711