數據庫表保持鎖定我有一個C#應用程序,它使用事務處理SQL Server數據庫內的表中的數據。該代碼是非常簡單的,基本上是這樣的:如果客戶端進程在事務啓動後被終止
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