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

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

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

Re[6]: DBの連続更新でエラー時rollbackがされない


(過去ログ 49 を表示中)

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

■26548 / inTopicNo.1)  DBの連続更新でエラー時rollbackがされない
  
□投稿者/ ありあり (8回)-(2008/10/14(Tue) 11:34:49)

分類:[C#] 


VisualStudio2005 C#,OS windowsXPで開発しています。

トランザクションを使用して、ループ内で連続でsql(いずれもUPDATE文)を発行し、
エラーのあった場合はロールバックをさせたいと思っています。

ArrayList updateSql = new ArrayList();
updateSql.Add(UpdateSql1); update文1(正常)
updateSql.Add(UpdateSql2); update文2(エラーを含む)

IDbCommand comm = conn.CreateCommand();
IDbTransaction trn = conn.BeginTransaction();
comm.Transaction = trn;
foreach (string sql in updateSql) {

comm.CommandText = sql;
try {
ret_cd = comm.ExecuteNonQuery();
} catch(Exception ex) {
trn.Rollback();
break;
}
}

今起こっている現象は、update文1の後、update文2を実行してエラーの為にrollbackするのですが、
先に実行したupdate文1が勝手にコミットされてしまうようで、rollbackされないのです。
後に実行したupdate文2はrollbackされています。

ループでSQLを実行するという方法が悪いのでしょうか。
ループを使わないとするならば以下のようになると思います。


IDbCommand comm = conn.CreateCommand();
IDbTransaction trn = conn.BeginTransaction();
comm.Transaction = trn;
          try {
comm.CommandText = UpdateSql1;
ret_cd = comm.ExecuteNonQuery();
comm.CommandText = UpdateSql2;
ret_cd = comm.ExecuteNonQuery();
} catch(Exception ex) {
trn.Rollback();
}

ご教授よろしくお願いします。
引用返信 編集キー/
■26549 / inTopicNo.2)  Re[1]: DBの連続更新でエラー時rollbackがされない
□投稿者/ やじゅ (697回)-(2008/10/14(Tue) 12:43:26)
やじゅ さんの Web サイト
No26548 (ありあり さん) に返信
>

Commit句が無いのが気になる以外、特に問題ない気がします。
本当にupdate文1がコミットされてしまうのか確認した方がいいですね。

引用返信 編集キー/
■26550 / inTopicNo.3)  Re[2]: DBの連続更新でエラー時rollbackがされない
□投稿者/ こあら (38回)-(2008/10/14(Tue) 12:48:25)
> 後に実行したupdate文2はrollbackされています。

ついでに trn.Rollback(); が本当にロールバックできているかも確認した方が良さそうです。
#エラーとなるupdate文2でrollbackされているかどうかわかりますか?
引用返信 編集キー/
■26551 / inTopicNo.4)  Re[2]: DBの連続更新でエラー時rollbackがされない
□投稿者/ ありあり (9回)-(2008/10/14(Tue) 12:49:53)
No26549 (やじゅ さん) に返信
> ■No26548 (ありあり さん) に返信
>>
>
> Commit句が無いのが気になる以外、特に問題ない気がします。
> 本当にupdate文1がコミットされてしまうのか確認した方がいいですね。
>

commitは元々のロジックの下のほうでやっています。catchのところでフラグtrueにし、フラグがfalseならコミットしています。
載せてませんでしたすみません。
引用返信 編集キー/
■26552 / inTopicNo.5)  Re[3]: DBの連続更新でエラー時rollbackがされない
□投稿者/ みきぬ (143回)-(2008/10/14(Tue) 12:58:15)
update文1を実行した後で、明示的に trn.Rollback(); を実行してみれば、ロールバックが本当に利くかどうか判断できるでしょう。

# DBはなんでしょね。実は MySQL だったりとか。
引用返信 編集キー/
■26553 / inTopicNo.6)  Re[4]: DBの連続更新でエラー時rollbackがされない
□投稿者/ ぷさいくろう (4回)-(2008/10/14(Tue) 13:11:10)
そこでミニマムコードですよ
引用返信 編集キー/
■26558 / inTopicNo.7)  Re[4]: DBの連続更新でエラー時rollbackがされない
□投稿者/ ありあり (10回)-(2008/10/14(Tue) 13:47:22)
No26552 (みきぬ さん) に返信
> update文1を実行した後で、明示的に trn.Rollback(); を実行してみれば、ロールバックが本当に利くかどうか判断できるでしょう。
> 
> # DBはなんでしょね。実は MySQL だったりとか。

DBはmysqlです。1行目実行後、rollbackしてみたのですが、ロールバックされませんでした。
                    
          IDbCommand comm = conn.CreateCommand();
                    comm.Transaction = trn;
                    int count = 0;
                    foreach (string sql in updateSql) {
                        
                        comm.CommandText = sql;
                        try {
                            ret_cd = comm.ExecuteNonQuery();
                            count++;
                            if (count == 1) {
                                trn.Rollback();
                            }
                        } catch (Exception ex) {
                            trn.Rollback();
                            rollbackFlg = true;
                            break;
                        }
                    }

                    //すべてのsql文が正常にUPDATEされた場合
                    if (rollbackFlg == false) {
                        
                        //trn.Commit();
                    
                    } 

引用返信 編集キー/
■26559 / inTopicNo.8)  Re[5]: DBの連続更新でエラー時rollbackがされない
□投稿者/ やじゅ (698回)-(2008/10/14(Tue) 13:51:33)
やじゅ さんの Web サイト
No26558 (ありあり さん) に返信

ミニマムコードだとして・・・
if (count == 1) {
rollbackFlg = true; ← 抜けてるよね
trn.Rollback();
}

引用返信 編集キー/
■26560 / inTopicNo.9)  Re[5]: DBの連続更新でエラー時rollbackがされない
□投稿者/ みきぬ (144回)-(2008/10/14(Tue) 13:53:52)
No26558 (ありあり さん) に返信

MySQL がデフォルトで使っている MyISAM ストレージエンジンはトランザクション非対応ですよ〜。
トランザクション処理がしたければ、別のストレージエンジン(InnoDBとか)を使ってください。
引用返信 編集キー/
■26561 / inTopicNo.10)  Re[6]: DBの連続更新でエラー時rollbackがされない
□投稿者/ やじゅ (699回)-(2008/10/14(Tue) 13:55:09)
やじゅ さんの Web サイト
すみません。コミットもコメントアウトしてたんですね。
//trn.Commit();
引用返信 編集キー/
■26564 / inTopicNo.11)  Re[6]: DBの連続更新でエラー時rollbackがされない
□投稿者/ ありあり (11回)-(2008/10/14(Tue) 15:18:33)
No26560 (みきぬ さん) に返信
> ■No26558 (ありあり さん) に返信
>
> MySQL がデフォルトで使っている MyISAM ストレージエンジンはトランザクション非対応ですよ〜。
> トランザクション処理がしたければ、別のストレージエンジン(InnoDBとか)を使ってください。

テーブルの種別を調べてみたら、MyISAMでした。ご指摘、どうもありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -