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すでに開かれています。これ以外の接続は使用しません
cmdconn.CreateCommand()これ以外の場所ではコマンドを使用しません
このプロセス全体で接続を閉じることはありませんが、SqlDataReader はconfigurationジョブを実行するときに関数で閉じられます。