1

このように見えるコードがいくつかあります(エラー処理やその他のものは削除されています)

using (var tran = conn.BeginTransaction())
{
    var client = new Service(...);
    var dialog = client.GetConversation(null, conn, tran);
    var response = dialog.Receive();

    // do stuff with response, including database work

    dialog.Send(message, conn, tran);
    dialog.EndConversation(conn, tran);

    tran.Commit();
    conn.Close();
}

私たちはこのコードを継承しており、ServiceBrokerの専門家ではありません。次のように、会話をトランザクションの外に移動すると問題が発生します。

var client = new Service(...);
var dialog = client.GetConversation(null, conn, tran);
var response = dialog.Receive();

using (var tran = conn.BeginTransaction())
{
    // do stuff with response, including database work
    tran.Commit();
}

dialog.Send(message, conn, tran);
dialog.EndConversation(conn, tran);
conn.Close();
4

1 に答える 1

1

この場合、メッセージを受信し、そのメッセージはキューから削除されます。あなたはそれを再び受け取ることができなくなります。

すべてのコードがトランザクション中であり、メッセージ処理でエラーが発生した場合、トランザクションはコミットされず、メッセージはキューに残ります(デフォルトでは、5回のロールバックキューが無効になった後)。したがって、エラーの理由を検出して修正し、メッセージを再度処理できます(予期される例外によってロールバックが発生することはなく、それらを処理する方法はかなりあります)。

私はすべてが取引されるべきだと言うでしょう。

于 2012-06-29T11:25:56.220 に答える