C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 多重トランザクション


(過去ログ 98 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■58392 / inTopicNo.1)  多重トランザクション
  
□投稿者/ asuka (32回)-(2011/04/01(Fri) 16:41:59)

分類:[C#] 

お世話になっております。

C#でSqlClientクラスでSQL分を書いています。

メインとサブで別々のSqlClientモジュール(変数)で同データベースに接続しています。

メインでは該当テーブルデータを削除(TRUNCATE TABLE)しており、サブでデータをインサートしています。

サブが失敗した場合はメインのトランザクションをロールバックしてデータを戻したいのですが、

メインとサブで別々のSqlClientで接続しているためか、メインでロールバックしてもサブでインサートしで成功したデータが残っています。
(こういうものなのでしょうか?)

サブが失敗した場合はメインでロールバックするとデータを削除前に戻したのですが、実現するにはどのような構成をとればよいのでしょうか?

単純にメインで接続しているオブジェクト(SqlConnection)をサブに渡せばよいのかな?

とも思ったのですが(未検証)、何かいい方法があればご教授頂けると幸いです。
m(__)m

※実際のテーブルはカラムが多いので一時テーブルに元データをコピーなどは避けたいです。

---イメージ---
Main()
{
 SqlConnection SCon;
 SqlCommand SCmd;
 SqlTransaction STran;

 SCon.Open();
 SCmd = SCon.CreateCommand();
 SCmd.CommandText = "TRUNCATE FROM TestTable"
 STran = SCon.BeginTransaction();
 SCmd.Transaction = STran;
 SqlCmd.ExecuteNonQuery();
/*
 if ( SubFunction() )
 {//成功
  SqlCmd.Transaction.Commit();
 }
 else
 {//失敗
  SqlCmd.Transaction.Rollback();
 }
*/
 //サブ内のSqlClientで同DB(テーブル)に接続してデータインサート
 SubFunction();

 //検証のため絶対にロールバック
 //サブのデータ挿入前になるはず - ならない TT
 SqlCmd.Transaction.Rollback();
---
VS2010
WinXP

引用返信 編集キー/
■58396 / inTopicNo.2)  Re[1]: 多重トランザクション
□投稿者/ ペニー (1回)-(2011/04/01(Fri) 18:58:30)
No58392 (asuka さん) に返信
> メインとサブで別々のSqlClientで接続しているためか、メインでロールバックしてもサブでインサートしで成功したデータが残っています。
> (こういうものなのでしょうか?)

こういうものです。
別々のトランザクションであるならば、それぞれは独立しています。
メインとサブで同じトランザクション内で処理しなければ、期待する結果は得られません。

> 単純にメインで接続しているオブジェクト(SqlConnection)をサブに渡せばよいのかな?

その通りです。
引用返信 編集キー/
■58398 / inTopicNo.3)  Re[2]: 多重トランザクション
□投稿者/ asuka (33回)-(2011/04/01(Fri) 20:25:45)
ペニー様

明確なお答えありがとうございます。

覚悟がきまりました。^^;


解決済み
引用返信 編集キー/
■58414 / inTopicNo.4)  Re[3]: 多重トランザクション
□投稿者/ なちゃ (486回)-(2011/04/04(Mon) 09:15:30)
SQL Sever 2008 以降なら、TransactionScope などによる自動トランザクションを使う手もあります。


ところでそれとは別の話ですが、トランケートってロールバックとか出来ましたっけ?

解決済み
引用返信 編集キー/
■58415 / inTopicNo.5)  Re[4]: 多重トランザクション
□投稿者/ なちゃ (487回)-(2011/04/04(Mon) 09:19:40)
No58414 (なちゃ さん) に返信
> ところでそれとは別の話ですが、トランケートってロールバックとか出来ましたっけ?

お〜っと失礼、どうやらSQL Severは出来るんですね…

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -