private void btnConfigure_Click(object sender, EventArgs e)
{
try
{
dbConfigure dc = new dbConfigure();
SqlTransaction tr = conn.BeginTransaction();
cmd.Transaction = tr;
if (dc.configuration(cmd, ps.tableNames))
tr.Commit();
else
{
tr.Rollback();
mesg.show("Transaction is Rolled back");
}
}
catch (Exception ex)
{
mesg.show(ex.Message);
}
}
メソッドのどこかで問題が発生するconfiguration
と、 false が返され、メッセージが表示されますTransaction is Rolled Back
。しかし、実際にはトランザクションは完全にはロールバックされず、この関数によって行われたデータベース構造の変更の一部は、ロールバックにもかかわらずそこにとどまりますが、これはまったく望ましくありません。私の質問は、トランザクションのロールバックの誤動作の可能性は何ですか?
私のプロジェクトには、共有された(上記の)メソッド以外にトランザクションはありません
ささいな詳細
configuration
クラスの非常に長い/複雑な関数を呼び出していdbConfigure
ます。データベース構造に必要な変更を加えます。例えばそれ
- foriegnKeys をドロップします
- 主キーを削除
自動インクリメント フィールドを削除します
ドロップする前にこれらのキーを保存し、目的の順序/位置で再作成します
conn
はSqlConnection
すでに開かれています。これ以外の接続は使用しません
cmd
conn.CreateCommand()
これ以外の場所ではコマンドを使用しません
このプロセス全体で接続を閉じることはありませんが、SqlDataReader はconfiguration
ジョブを実行するときに関数で閉じられます。