2012-09-24 37 views
1

OS:的Solaris
數據庫:Informix的DELETE阻塞INSERT

我有其中有2個線程的過程:

線程1應對新的交易和做DB INSERTS
線程2交易與現有的交易和做DB DELETES

問題

線程1不斷在表上添加INSERT(添加新事務)。
線程2根據主鍵

刀片是因爲Informix的錯誤244其中正在發生由於頁/表鎖定的失敗被連續操作的方式從同一表中刪除(移除到期的交易)。

我想,DELETE正在做一個表鎖而不是行鎖,並阻止INSERTs工作。

有沒有什麼辦法可以防止這種死鎖?


編輯

我發現了另一條線索。 244錯誤是由SELECT查詢造成的。
在執行操作之前,insertdelete操作都會從頻繁更新的表中執行select

分離設置爲COMMITTED READ。當我從dbaccess手動在該表上執行select時,發生刪除時,出現同樣的錯誤。

+0

哪個版本的Informix?你有沒有頁面鎖定或行鎖定在桌子上? DELETE語句的形式是什麼? –

回答

1

如果DELETE在通過主鍵刪除單個元素時執行全表鎖定,我會感到非常驚訝。相反,一個(或兩個)事務本身的壽命很可能由於修改的行數而最終導致表鎖定。通常,通過消除每個事務中除了單行操作以外的所有操作,並確保您的事務模型是讀取提交,您可以避免像這樣的易失性表中的死鎖。至少這是我的經歷。

+0

當我看到在'onstat'輸出中由我的進程創建的'IX'鎖時,我得到了全表鎖的線索。我覺得'DELETE'會是罪魁禍首。請注意,該線程中會發生很多連續的單行刪除操作。 – cppcoder

+0

他們都在同一個交易?如果是這樣,那就是你的扶梯。特別是如果他們在隨意灑落的頁面上隨處可見。它絕對是強制性的,他們是集體xact? – WhozCraig

+0

每個單行刪除都在一個事務中。 – cppcoder