0

宣言型アプローチによるトランザクション管理を使用しており、 update*で始まるすべてのメソッドがトランザクションに従う必要があることを指定しています。

このメソッド内にトランザクション メソッドupdatePayroll()があり、別の 4 つのメソッドを呼び出しているとしますが、最初の 2 つのメソッドが失敗した場合にのみロールバックする必要があります。それ以外の場合はロールバックは必要ありません。私のupdatePayroll()は処理されたメソッドであるため、これを実装する方法がわかりません。そのため、updatePayroll( )の 2 つのメソッドのみを処理する必要があることをスプリングに伝える方法はありません。

コード:

public void updatePayroll()
{
// below two methods of updateParyroll is required transaction where updatePayroll is transacted method through declarative approach.
updateLWPEmployees();

processSalary();

// below methods does not require transaction.
printSalarySlip();

sendEmail();
}

前もって感謝します。

4

3 に答える 3

0

最初の 2 つのメソッドを含むトランザクション メソッドを作成してみませんか? そして、updatePayroll()トランザクションのないメソッドにこのメソッドを含めますか?

于 2012-10-29T09:08:03.030 に答える
0

技術的なことを言う前に、トランザクションは純粋な技術的概念ではないという事実を概説します。この必要性が、直面した技術的な問題を回避したいだけではないことを願っています。例外のトリガーに続くトランザクションのロールバック動作のセマンティクスを可能な限り変更しないようにする必要があります。つまり、技術的な問題 (RuntimeException) が発生した場合は、トランザクションをロールバックさせた方がよいでしょう (これがデフォルトの動作です)。予期していなかったからです。このようなシナリオで、技術的に一貫性がないことがわかった場合、おそらくこの処理は論理的にトランザクションの一部ではありません。それ以外の場合、スローされるのが例外(設計中に計画されたビジネス例外)である場合、最初の回答で説明したように、ロールバックするかどうかを完全に制御できます。

@woodpecker: あなたが提案した解決策は、分離に関して言えば、技術的に言えば同じではありません。特に、汚れた反復可能な読み取りを回避しようとしている場合はそうです。

于 2012-10-29T10:40:14.640 に答える
0

トランザクション管理構成の変更を避けたい場合は、

  1. を拡張するダミー クラスを作成し、それをRuntimeException呼び出すことができますNoRollBackException。今度は、トランザクション マネージャが の場合にロールバックしないように設定する必要がありますNoRollBackException。後で、2 つのメソッド printSalarySlip() と sendEmail() を try catch ブロックに入れて、NoRollBackException.

また

  1. (より単純なアプローチ) printSalarySlip() and sendEmail()updatePayroll の呼び出しが成功した後、別の関数で 2 つのメソッド ( ) を呼び出すことができます。

また

  1. 2 つのメソッドによってスローされた例外をキャッチし、例外の伝播を許可しないようにすることができます。

上記の方法はすべて、探していることを正確に実行します。

于 2012-10-28T05:58:19.983 に答える