2011-07-06 54 views
0

我有msaccess數據庫連接到sql server通過鏈接表使用「sql server」odbc驅動程序。除了涉及交易時,它大多運作良好。msaccess odbc到sqlserver 2005鎖定:超時

問題我想不通一種解決方法是「鎖:超時」,當MSACCESS形式決定對自己進行刷新,而大交易正在處理(10-30秒)發生。

如果msaccess嘗試擊中被事務鎖定的行,sql分析器會立即顯示Lock:Timeout,但MSAccess無法處理此事件,並鎖定應用程序直至其自身的querytimeout過期(60秒)。愚蠢的是,它也暫停了VBA,因此交易無法完成。

除了關閉在這些批次中打開的所有表單之外,我該怎麼辦?

如果我能設置的ODBC連接的是MSSQL鎖定超時,該交易可能有機會來完成,但似乎並沒有成爲這個連接字符串參數。這很棘手,因爲MSAccess的背景行爲大多不受我的控制。我很確定沒有可以爲sql數據庫設置的全局鎖定超時。

任何想法? 謝謝 盧克

回答

0

而不是使用msaccess currentproject.connection,我直接啓動一個新的ADODB連接到SQL服務器,然後設置鎖定超時。例如 cnn.execute "set lock_timeout 1000"。然後,當連接超時失效時,這個連接將會拋出一個錯誤 - 你可以捕獲這個錯誤。這個缺點是你必須把jet sql翻譯成tsql。好處是你可以把翻譯好的tsql放到存儲過程中,讓它運行得更快。

我發現了一些技巧,以減少鎖定MSACCESS並試圖通過把一個事務之前的量。在開始事務之前加入一個doevents有助於控制 - 它可以讓控制返回到msaccess,以便它可以趕上它可能正在進行的任何異步刷新。

在另一個例子中,我有一個計算列,它花了很長一段時間後me.refresh計算(3-5秒)。我需要那個。刷新並且正在尋找比禁用控制更好的解決方案。我發現如果在捕獲一個鎖定錯誤後重試事務,只要我在每個語句之間都有一個doevents,它就會在5次嘗試中工作。然後我發現這種延遲通常會讓msaccess完成這件事。

tt = Timer: Do While Timer - tt < 5: DoEvents: Loop 

這樣的麻煩是你不知道等待多長時間。因爲我不喜歡反覆重複交易,所以我添加了一個可以忍受的等待,這個等待在大多數情況下都足夠了,當我不把錯誤丟回給用戶重新嘗試時。

我希望有一種方式來獲得訪問完事,放棄其鎖並一度保持沉默。

+0

這是否適用於ODBC鏈接表以及在其上創建的DAO記錄集? –

+0

我假設你的意思是使用dao和msaccess的當前連接。我真的不知道如何設置這些鎖定超時。我相信在locktimeout發生後它會很好地運行currentdb.querytimeout。我正在用半打自動化虛擬機來壓力測試我的數據庫,並且我不能在我的生活中弄清楚如果某些事情被另一個客戶端鎖定,如何及時使msaccess超時。我想這是另一個問題。儘管微軟在2006年發表了Andy Baron的論文,但我開始懷疑msaccess和odbc在多用戶環境中的可行性。 –

+0

好吧,有很多DAO記錄集沒有在代碼中明確創建。例如,當您分配使用ODBC鏈接表的窗體的記錄集時,窗體的.Recordset屬性是一個DAO記錄集。所以,我的問題是ADO超時設置與Access中所有ADO記錄集根本不涉及(因爲ADO沒有涉及數據訪問)的地方有什麼關係? –

0

我找到了一個更好的辦法是派遣VBA計算結果未綁定到任何MSACCESS界面對象的服務器端表,然後再打一個「終結」過程,它使用該表來更新其他表,可能是界。

由於所有的時間都在vba中並將結果發送到服務器,所以最終處理過程很快,所以可以重複執行,直到放棄鎖定爲止,且客戶端等待時間可以忽略不計。

在服務器端表中數據的前後存儲允許檢測在vba計算過程中可能被另一個進程更改的行。這樣可以避免長時間鎖定任何內容,從而在無法處理服務器鎖定超時時增加msaccess凍結的風險。

如果在finalization proc的事務期間發生表單刷新(在2k3和2k7版本中確認),但是msaccess凍結仍然可能發生,但它無法阻止此proc完成,因此更糟糕的是,會導致一分鐘的延遲客戶。