2011-03-14 45 views
2

我有兩個VC++ 6應用程序在通用的Access 2000數據庫中寫入/更新數據 - 兩個應用程序都從不同的數據記錄器中下載信息。記錄如何存儲在MS Access頁面中?記錄可以存儲在兩頁中嗎?

幾乎每隔一段時間,我們在嘗試做一個添加/編輯/更新時的異常:

(3260)無法更新;目前 被用戶'admin'鎖定在機器上 'abc123'。

我相信問題與數據庫中的記錄鎖定有關。

我們使用CDaoRecordset來訪問數據。從閱讀文檔看來,缺省情況是樂觀地鎖定記錄所在的數據庫頁面。如果另一個進程嘗試在同一頁面中編輯/更新記錄,他們會看到我們看到的錯誤。

移動到SQL Server不是一個選項在這一點上 - 這不是一個簡單的變化,因爲事情的結構。

我想知道是否可以使受影響的表中的記錄足夠大,以便每個2k數據頁只能有一條記錄。如果我使每個記錄長1100個字節,那麼每個記錄應該有自己的頁面,解決鎖定問題。我知道它會佔用更多的磁盤空間,但目前這並不是問題,因爲受影響的表是相當低的磁盤空間。

會這樣嗎? Access 2000中的記錄可以分成兩頁嗎?

回答

1

腹脹記錄只是爲了避免鎖定衝突並不是一個非常實用的方法。首先,Access數據庫限於2 GB。這包括系統表。我建議你捕捉錯誤並再次嘗試操作。不知道C++,我不能給你這樣做的代碼,但我認爲你已經知道如何做到這一點。

+0

我已經把這作爲答案,因爲這是我們最終做的。 – 2011-04-27 05:00:07

0

從查看Access 97/Jet 3.5和Access 2000/Jet 4.0行爲之間的差異,我相信Access 2000中的新記錄已放置在他們自己的頁面中。與Access 97文件相比,我發現Access 2000數據庫文件中存在更多「膨脹」。

因此,我懷疑你的問題更多的是基本的表和索引鎖定,而不是記錄鎖定。更新所有索引可能需要一段時間,即毫秒。正如比爾說重新操作。我建議加一個10或50毫秒的延遲。並限制重試次數爲10.

+0

我見過的兩篇Access民間傳說已經報道,但有一些疑問是,在Jet 4.0中啓用記錄級鎖定以後,會導致每條記錄存儲在單獨的數據頁面上。我不相信這是正確的。其次,民間傳說稱DAO不能使用除頁面級鎖定以外的任何內容,而ADO可以使用記錄級鎖定。我在文檔中看到似乎與此相矛盾的證據。 – 2011-03-15 20:10:51

0

隨機的自動編號PK可能允許您增加併發性,因爲Jet/ACE表存儲在PK上(即按PK順序)。使用隨機的自動編號,壓縮表格將以基本上隨機的順序存儲,而不是以頂部較舊的記錄和較新的記錄聚集在一起。

但是,壓縮後添加的記錄將在臨時分段數據頁中而不是集羣PK順序中,所以實際上我不知道這是否會增強實際意義上的併發性。這可能只是理論上的(即每次添加記錄後都必須進行壓縮)。