• 締切済み

.NET Framework(C#)で分散トランザクションを行う方法

SQL Server 2000と.NET Framework(C#)で、手動の分散トランザクションを行いたいのですが、MSDN調べても断片的なものしか得られず、わかりません。 あちこち探しても概念的な話はあっても、実際にサンプルとなるようなコードレベルの物は見つけられずに悩んでいます。 どこかにサンプルとなるような具体的なコード、又は解説などがあるURLや、MSDNのここを見ればわかるのような情報ありましたらお願いします。 もちろん、具体的に説明してもらえるならそれでもいいです。ここで説明できる程度におさまらないような気もしますが。

みんなの回答

  • 7marine
  • ベストアンサー率36% (59/160)
回答No.1

確かにMSDNで調べても分かりやすいサンプルないですね。 実装をしたことはないので、自信無いですけどスケルトンを作ってみました。参考になれば幸いです。 SQL Serverにも2フェーズコミットを行う仕組みがあるかもしれませんが、 ストアドプロシージャのreturnの値で処理が成功したかどうかを判断しています。 急いで書いたのでコードはまったく検証していません。(シンタックスエラーが出るかも) using System.Data.SqlClient; void hogehoge(){ SqlConnection con1 = new SqlConnection("~"); SqlCommand cmd1 = con1.CreateCommand(); cmd1.CommandText ="exec @result=Proc1"; cmd1.Parameters.Add("@result",SqlDbType.Int); cmd1.Parameters["@result"].Direction = ParameterDirection.ReturnValue; SqlConnection con2 = new SqlConnection("~"); SqlCommand cmd2 = con.CreateCommand(); cmd2.CommandText ="exec @result=Proc2"; cmd2.Parameters.Add("@result",SqlDbType.Int); cmd2.Parameters["@result"].Direction = ParameterDirection.ReturnValue; con1.Open(); SqlTransaction tran1 = con1.BeginTransaction(); cmd1.Transaction = tran1; con2.Open(); SqlTransaction tran2 = con2.BeginTransaction(); cmd2.Transaction = tran2; cmd1.ExecuteNonQuery(); cmd2.ExecuteNonQuery(); if(((int)cmd1.Parameters["@result"] == 0) && ((int)cmd2.Parameters["@result"] == 0)){ tran1.Commit(); tran2.Commit(); }else{ tran1.Rollback(); tran2.Rollback(); } con1.Close(); con2.Close(); }

terra5
質問者

お礼

わざわざありがとうございます。 ですが、質問の仕方が悪かったようです。お手数おかけしたのにすいません。 詳しくは補足に。

terra5
質問者

補足

やりたいことはその2フェーズコミットです。 私の説明不足でした。すいません。 2フェーズコミットは実現方法というか動作原理というかのためか、それで探すと更に情報が見つかりません。 MSDNなどは分散トランザクションという言葉で説明していましたので、それに合わせました。 SQL 7以降(6.5以降?)から可能になっているようです。 今のところわかった(つもり)なことは、分散トランザクション コーディネータ (MSDTC、Microsoft Distributed Transaction Coordinator)が2相コミットを実現している、 サービスとして存在していて、デフォルトでは手動起動になっている、 Enterprise Servicesを使用する(System.Enterprises)、 Connection.EnlistDistributedTransaction()を使うようだ といったところです。 また、MSDNは自動トランザクションを推奨しているようですが、それでは無理なケースが出てくると思われるので、手動で行う方法を探してます。 もっとも、自動ですらまだ動作させることができていませんが。 また、ストアドプロシジャは避けていただけるとありがたいです。

関連するQ&A