トランザクションを使用してSQL Serverデータベース内のテーブルのデータを操作するC#アプリケーションがあります。コードは非常にシンプルで、基本的にはこのように書き:今トランザクションの開始後にクライアントプロセスが終了した場合、データベーステーブルはロックされたままです
public string ConnectionString;
public OleDbConnection DbConnection;
public OleDbTransaction DbTransaction;
// ... some initialization stuff ...
DbTransaction = DbConnection.BeginTransaction();
try
{
// ... some insert/update/delete here ...
DbTransaction.Commit();
}
catch (Exception e)
{
// ...
DbTransaction.Rollback();
}
実行中のアクティブなアプリケーションインスタンスがありませんでしたが、状況は、表/行セットがロックされたままであることが、顧客によって報告されました。彼の最初の推測は、トランザクション中にエラーが発生し、ロールバックを持つtry-catch-blockが存在しないということでした(しかし、適切なエラー処理があるので、これは間違いありません)。 DbTransaction.Commit();
の前にデバッガでブレークポイントを設定してから、Windowsタスクマネージャからプロセスを終了すると、状況を再現できます。その後、トランザクションは開いたままです(私はそれが実行中であることを確認することができますDBCC OPENTRAN
)、アプリケーションの新しいインスタンスの使用をさらに禁止するロックが残っています。
私の質問:このような状況を安全に処理するにはどうすればよいですか?トランザクション開始後にプロセスが強制終了され、トランザクションをコミット/ロールバックする機会はありません。私が知る限り、アプリケーションがタスクマネージャ(「プロセス」タブ)から強制終了された場合、私は認識できません。だから私は何とか自動的にトランザクションを自動的に中止することができますか?助けてください。
ない修正ができますが、テーブルロック未満でこれを行うことができますか?より小さな取引を取ることができますか? – Paparazzi