|
分類:[.NET 全般]
こんにちは。 様々なところで調べたのですがどうしてもわからずこちらに質問させて頂きました。
開発環境:WindowsXP C# .NetFrramework 1.1 SQLServer2005
今、二つの新・旧のSQLサーバーに接続し、同じ内容の更新処理を行うプログラムを作成しております。 同期を取るようなイメージです。
処理の流れとしては旧DBを更新後、新DBを更新するといった感じです。 でここで、 旧DBの更新で失敗した場合は、ロールバックを行い、新DBへの更新処理を行わない というのはできるのですが、旧DBで更新できて、新DBで更新失敗した場合、新旧ともにロールバック するという処理を行いたいのですが、どうしてもできません。 SQLサーバーへの接続オブジェクトを別々で作成し、それぞれでBeginTransactionを実行すると 二つ目のBeginTransactionで”sqlClientは並列トランザクションをサポートしていません" とでます。 これの解決方法もしくは、両方のDBへの処理を1トランザクションで実現できる処理があれば 教えて頂けないでしょうか? 自動トランザクション、分散トランザクションについても調べましたが、実現できるのかも わかりませんでした。 宜しくお願いいたします。
以下はサンプルです。ところどころ省略してますが、必要な引数等は渡してあります。
try { //旧DBのコネクションオープン SqlConnection oldConnct = new SqlConnection(oldConnectionString); oldConnct.Open(); oldConnct.BeginTransaction();
//新認証DBのコネクションオープン SqlConnection newConnct = new SqlConnection(newConnectionString); newConnct.Open(); newConnct..BeginTransaction();←ここでこけます
//旧認証DB更新SQL実行 count = SqlHelper.ExecuteNonQuery(oldConnct,CommandType.Text,SqlString,parameterValues);
//新認証DB更新SQL実行 count = SqlHelper.ExecuteNonQuery(newConnct,CommandType.Text,SqlString,parameterValues);
//コミット処理
} catch(Exception ex) { //ロールバック処理 新DBへの更新が失敗した場合は新旧ともにロールバックを行う。 throw new Exception(ex.Message); } finally{ //コネクションオブジェクトを閉じる。 oldConnct.Close(); newConnct.Close(); }
|