トランザクションを使用して 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
)、ロックが残ります。これにより、アプリケーションの新しいインスタンスをさらに操作することができなくなります。
私の質問: このような状況を安全に処理するにはどうすればよいですか? トランザクションの開始後にプロセスが強制終了され、トランザクションをコミット/ロールバックする機会がありませんか? 私の知る限り、アプリケーションがタスク マネージャー ([プロセス] タブ) から強制終了されているかどうかはわかりません。それで、どういうわけか自動的にトランザクションを中止できますか (たとえば、タイムアウトの後)、または他に何ができますか? 助けてください。