Springビジネスに関するネストロールバックに関するいくつかのテストのまとめ(簡略化)
2139 ワード
目次クライテリア シーン前提 シーン1 シーン2 シーン3(普通は使わない) シーン4 前言
これは私がスプリング事務でビジネスネスト問題に関するいくつかの記録をまとめました.
シーンの前提
テストデータベース:sql server A類のservice A方法はB類のservice B方法を呼び出します.
シーン1
A、Bは事務注釈を使用しています.@Transactiol(rollbackFor=Exception.class)
テスト条件
結果
B異常発生、A未catch
Aはロールバックし、Bはロールバックします
B異常発生、Acatch異常、ログログ、投げられませんでした.
AはロールバックしてBはロールバックしますが、異常が発生しました.
B異常発生、Acatch異常、ログログ、投げ異常
Aはロールバックし、Bはロールバックします
B実行成功後、Aに異常が発生しました.
Aはロールバックし、Bはロールバックします
結論:A、Bは異常が発生するとAとBはロールバックします.
シーン2
Aは事務注釈を使用します.@Transation(rollbackFor=Exception.class)、Bは事務を使用しません.
テスト条件
結果
B異常発生、A未catch
Aはロールバックし、Bはロールバックします
B異常発生、Acatch異常、ログログ、投げられませんでした.
AもBもロールバックしません
B異常発生、Acatch異常、ログログ、投げ異常
Aはロールバックし、Bはロールバックします
B実行成功後、Aに異常が発生しました.
Aはロールバックし、Bはロールバックします
結論:Aに異常が発生したら、A、Bは全部ロールバックします.Bに異常が発生したら、Aスイッチが異常になりましたが、異常を投げ出さなかったら、A、Bは全部ロールバックしません.それ以外に、A、Bはロールバックします.
シーン三(普通は使わない)
A事務を使わないで、Bは事務注釈を使います.@Transactiol(rollbackFor=Exception.class)
テスト条件
結果
B異常発生、A未catch
Aは回転しないで、Bは回転します.
B異常発生、Acatch異常、ログログ、投げられませんでした.
Aは回転しないで、Bは回転します.
B異常発生、Acatch異常、ログログ、投げ異常
Aは回転しないで、Bは回転します.
B実行成功後、Aに異常が発生しました.
AもBもロールバックしません
結論:ABが異常が発生してもAはロールバックしない;Bだけ異常が発生して、Bはロールバックします.
シーン4
Aはデフォルトの事務注釈を使用しています.@Transaction=rollbackFor=Exception.class)Bは新しい事務注釈を使用しています.@Transactiol(propagation=Propagations.REQUIREScus、rollbackFor=Exception.class)
テスト条件
結果
B異常発生、A未catch
Aは回転しないで、Bは回転します.
B異常発生、Acatch異常、ログログ、投げられませんでした.
Aは回転しないで、Bは回転します.
B異常発生、Acatch異常、ログログ、投げ異常
Aはロールバックし、Bはロールバックします
B実行成功後、Aに異常が発生しました.
Aはロールバックして、Bはロールバックしません.
結論:Aは異常が発生しました.Aはロールバックして、Bはロールバックしません.Bは異常が発生しました.Bだけロールバックして、Aはロールバックしません.
つまり、ABは二つの独立した事務に属しています.互いに影響しません.
以上は個人テストで得た結論です.間違いがあれば、教えてください.
[参照]:浅解Spring事務伝播行為と隔離レベル
これは私がスプリング事務でビジネスネスト問題に関するいくつかの記録をまとめました.
シーンの前提
テストデータベース:sql server A類のservice A方法はB類のservice B方法を呼び出します.
ServiceA {
void methodA() {
ServiceB.methodB();
}
}
ServiceB {
void methodB() {
}
}
注意:springの@tranactionalは、運転中に異常な捕獲を行い、ロールバックを行い、すべての異常をロールバックさせるには@Transactiolを使用します.REQUIREDシーン1
A、Bは事務注釈を使用しています.@Transactiol(rollbackFor=Exception.class)
テスト条件
結果
B異常発生、A未catch
Aはロールバックし、Bはロールバックします
B異常発生、Acatch異常、ログログ、投げられませんでした.
AはロールバックしてBはロールバックしますが、異常が発生しました.
B異常発生、Acatch異常、ログログ、投げ異常
Aはロールバックし、Bはロールバックします
B実行成功後、Aに異常が発生しました.
Aはロールバックし、Bはロールバックします
結論:A、Bは異常が発生するとAとBはロールバックします.
シーン2
Aは事務注釈を使用します.@Transation(rollbackFor=Exception.class)、Bは事務を使用しません.
テスト条件
結果
B異常発生、A未catch
Aはロールバックし、Bはロールバックします
B異常発生、Acatch異常、ログログ、投げられませんでした.
AもBもロールバックしません
B異常発生、Acatch異常、ログログ、投げ異常
Aはロールバックし、Bはロールバックします
B実行成功後、Aに異常が発生しました.
Aはロールバックし、Bはロールバックします
結論:Aに異常が発生したら、A、Bは全部ロールバックします.Bに異常が発生したら、Aスイッチが異常になりましたが、異常を投げ出さなかったら、A、Bは全部ロールバックしません.それ以外に、A、Bはロールバックします.
シーン三(普通は使わない)
A事務を使わないで、Bは事務注釈を使います.@Transactiol(rollbackFor=Exception.class)
テスト条件
結果
B異常発生、A未catch
Aは回転しないで、Bは回転します.
B異常発生、Acatch異常、ログログ、投げられませんでした.
Aは回転しないで、Bは回転します.
B異常発生、Acatch異常、ログログ、投げ異常
Aは回転しないで、Bは回転します.
B実行成功後、Aに異常が発生しました.
AもBもロールバックしません
結論:ABが異常が発生してもAはロールバックしない;Bだけ異常が発生して、Bはロールバックします.
シーン4
Aはデフォルトの事務注釈を使用しています.@Transaction=rollbackFor=Exception.class)Bは新しい事務注釈を使用しています.@Transactiol(propagation=Propagations.REQUIREScus、rollbackFor=Exception.class)
テスト条件
結果
B異常発生、A未catch
Aは回転しないで、Bは回転します.
B異常発生、Acatch異常、ログログ、投げられませんでした.
Aは回転しないで、Bは回転します.
B異常発生、Acatch異常、ログログ、投げ異常
Aはロールバックし、Bはロールバックします
B実行成功後、Aに異常が発生しました.
Aはロールバックして、Bはロールバックしません.
結論:Aは異常が発生しました.Aはロールバックして、Bはロールバックしません.Bは異常が発生しました.Bだけロールバックして、Aはロールバックしません.
つまり、ABは二つの独立した事務に属しています.互いに影響しません.
以上は個人テストで得た結論です.間違いがあれば、教えてください.
[参照]:浅解Spring事務伝播行為と隔離レベル