2014-04-10 79 views
0

我正在使用mdb + DAO將大型MS-Access應用程序轉換爲使用SQL Server作爲後端。 到目前爲止,我有合理的成功,但這是一個相當噩夢的項目。 現在有些事情我難倒了近3天:MS-Access外部事務鎖SQL Server表

在Access中,我有以下的代碼片段(適用於簡潔):

Set oWS = DBEngine.Workspaces(0) 
oWS.BeginTrans: bInTrans = True 
sql = "UPDATE Artikels SET Status_OP = True, Status_OPDatum = #10/04/2014# WHERE Artikelnummer = 50808" 
CurrentDb.Execute sql, dbFailOnError 

'>> a bunch more business logic goes here 

sql = "UPDATE Artikels SET Creatiedatum = #15/11/2002 00:00:01#, Inputdatum = #11/06/2013 15:44:35#, Stockdatum = #28/02/2014 16:16:05#, [Stockdatum A] = #21/06/2011 16:28:59#, Verkoopdatum = #23/10/2013 10:35:06#, Wijzigdatum = #10/04/2014 12:47:18# WHERE Artikelnummer = 50808" 
CurrentDb.Execute sql, dbFailOnError 
oWS.CommitTransaction 

在執行第二條語句,應用程序鎖,直到SQL服務器報告事務超時。 在執行第一條語句之後,我立即注意到Sql Server在表Artikel上放置了一個IX鎖,這顯然導致第二條語句失敗。

當我刪除交易,一切運行良好。但是,所有語句都需要成爲一個事務的一部分(爲簡潔起見,回滾BL被省略)。

我一直在閱讀很多隔離級別,但我覺得這不是解決方案的來源。默認的READ COMMITTED似乎非常好。 任何人都可以幫助解決這個問題?

回答

0

1 /想法是SQL Server可能會決定在某些條件下鎖定整個表(例如服務器上缺少資源)。

2 /一個想法可能是將來自UStatus_OPDatum列的值存儲到變量中,然後執行單個UPDATE語句。

3您還應該儘可能晚地啓動事務,因此您可以從more business logic goes here中提取一些SELECT語句並在開始事務之前執行它們。

4 /愚蠢的問題:你確定你是單人運行這段代碼嗎?

+0

1)這是在我的開發機器上,有8Gb RAM和一個小型數據庫。 2)不確定你在這裏的意思。需要更新2列:Status_OP和Status_OPDatum。 3)SELECT語句需要在事務中,因爲它們需要讀取事務內先前語句可能更新的數據。這就是說,問題是連續的2個UPDATE語句導致鎖定表,即使我不在它們之間執行任何其他操作。 4)我很積極。這是在我的開發機器上打開Access數據庫的單個實例。 –