2009-07-28 6 views
0

私はいくつかのExecuteNonQuery()ステートメント(ストアドプロシージャ)を同じデータベース(Sqlサーバー2005)に送るasp.net Webサイトを持っています。 MSDTCサービスは、Webサーバーとデータベースサーバーの両方でオフになっています。複数のExecuteNonQuery()を同じデータベースに送信すると、使用するトランザクションタイプとエラーチェックは何ですか? (.NET)

これらのステートメントは、すべて正常に実行する必要があります。だから私はトランザクションでそれらをラップする必要があります。 SQLTranscationを使用する最善の方法はありますか? Commandオブジェクトをトランザクションにアタッチし、コマンドオブジェクトを通じてこれらのステートメントを実行しますか?どのような種類のエラーチェックは、コードの中で成功したコミットやロールバックが発生するように、ストアドプロシージャで行う必要がありますか?

+0

なぜMSDTC-は分散トランザクションを使用する必要がないことを確認したいのですか? – RichardOD

答えて

1

.NETのSystem.Transactionsクラスだけでも構いません。いくつかはquickstart examples of how to use them hereです。その後、TransactionScopeであなたのExecuteNonQuery()の要素をラップすることができます

using (TransactionScope ts = new TransactionScope()) 
{ 
    // Your DB inserts 

    ts.Complete(); 
} 
+0

TransactionScopeがいつDTCを使用するかを知る必要があります。私が言ったように、DTCは選択肢ではありません。 –

+0

全体を通して同じデータベースを使用しているので、私はそれが信じられません。 –

+0

2番目の接続オブジェクトが再生されるとすぐにDTCが使用されます。 –

1

可能な場合は、アトミックエラーやトランザクションを処理するために設計されたストアドプロシージャのテンプレートの例については、このブログを参照してください:Exception handling and nested transactions。あなたはどちらかのSqlTransactionを開始し、各SqlCommandオブジェクトに添付する必要があるクライアントで

using (SqlTransaction tn = conn.BeginTransaction()) 
{ 
    cmd1 = new SqlCommand("...", conn, trn); 
    cmd1.ExecuteNonQuery(); 
    cmd2 = new SqlCommand("...", conn, trn); 
    cmd2.ExecuteNonQuery(); 
    ... 
    trn.Commit(); 
} 

か、ADO.Netがそれらを知っているので、CLRのトランザクションを使用することができますし、中にあなたのSqlCommandsを登録しますトランザクション。

同じ接続ですべてのコマンドを実行する必要があります。そうしないと、(同じサーバー上にあっても)分散トランザクションが必要になります。

1

他のすべてのプロシージャを順番に呼び出すストアドプロシージャを呼び出して、トランザクションを単一のデータベースコールにすることができればもっと安全です。このようにして、トランザクションはデータベース上で完全に管理され、データベースとWebサーバー間で「拡散」されません。トランザクションがWebサーバーによって管理され、Xストアドプロシージャ間で「保持」されていて、いずれか1つが失敗した場合は、トップレベルのプロセス(Webサイト)が何らかの形でロールバックを管理する必要があります必要なクリーンアップ(難しいかもしれません)。

関連する問題