2013-10-30 65 views
6

數據庫表保持鎖定我有一個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),並且鎖定仍然存在,禁止進一步使用應用程序的新實例。

我的問題:我該如何安全地處理這種情況 - 進程在事務啓動後被終止並且沒有機會提交/回滾事務?據我所知,如果應用程序在任務管理器中被殺死(「進程」選項卡),我無法識別。所以我可以以某種方式自動中止交易(例如,在一段時間後)或者我還能做什麼?請幫忙。

+0

不是一個真正的修復,但你可以做到這一點用了不到表鎖?你可以採取較小的交易? – Paparazzi

回答

相關問題