2

次のようなサービス コンポーネントを取得しました (私が書いたものではありません)。

[Transaction(TransactionOption.Required, Isolation = TransactionIsolationLevel.Serializable, Timeout = 120), EventTrackingEnabled(true)]
public class SomeComponent : ServicedComponent
{
    public void DoSomething()
    {
        try
        {
            //some db operation
        }
        catch (Exception err)
        {
            ContextUtil.SetAbort();
            throw;
        }
}

本当にContextUtil.SetAbort()必要ですか?コンポーネントが残っている場合、例外はトランザクションを中止しませんか?

4

1 に答える 1

2

トランザクションを手動で管理する場合のみ。

[AutoComplete]このように属性を使用して操作を装飾すると、コンポーネントは自動的に中止 (例外が発生した場合) またはコミットするように投票します。

[AutoComplete]
public void DoSomething()

編集:

この属性の詳細については、次のMSDNを参照してください。

メソッド呼び出しが正常に戻ると、トランザクションは自動的に SetComplete を呼び出します。メソッド呼び出しが例外をスローすると、トランザクションは中止されます。

とにかく、(まれに)トランザクションを手動で管理する必要がある場合は、トランザクションを疑わしいままにしないことが非常に重要です。あなたのコードには、ContextUtil.SetComplete();明示的に呼び出す必要があるものがありません。

于 2012-10-18T12:24:19.717 に答える