2010-10-19 170 views
3

我正在開發一個使用Django + Postgresql的系統。這是我第一次使用postgresql,但是我選擇它是因爲我需要事務和外鍵功能。Postgresql鎖死鎖

在某個視圖中,我必須用AccessExclusiveLock鎖定我的表,以防止在此視圖中進行任何讀取或寫入。這是因爲我在保存/更新我的實體之前對整個數據進行了一些檢查。

我注意到不時發生的不一致錯誤。這是因爲在鎖定語句之後直接發生了select語句。它要求有AccessShareLock。我閱讀postgresql website AccessShareLock與AccessExclusiveLock衝突。

我不明白的是爲什麼它首先發生。爲什麼postgresql會要求隱式鎖,如果它已經有一個明確的鎖來覆蓋那個隱式鎖?我不明白的第二件事是爲什麼這個視圖在兩個不同的postregsql進程上運行?他們是不是應該在一次交易中收集?

Thanx提前。

+0

你能提供導致這個問題的例子嗎?如一個工作示例。 – Kuberchaun 2010-10-19 15:45:07

+1

OT:不要在「developer.postgresql.org」使用文檔 - 有Postgres的下一個但尚未發佈的版本。 – 2010-10-19 18:16:24

+0

@ StarShip3000恐怕我做不到。專有的廢話。 – thelinuxer 2010-10-20 13:07:55

回答

1

在PostgreSQL中,我建議在會話中設置相應的事務隔離級別,而不是獲取獨佔訪問鎖。因此,運行你的「更新」之前,請發送以下命令到您的數據庫:

begin; 
set transaction isolation level repeatable read; 
-- your SQL commands here 
commit; 

根據你的描述,你需要重複的讀取隔離級別。

+2

我想accorging這個http://stackoverflow.com/questions/2280779/django-transaction-isolation-level-in-mysql-postgresql我不能使用Django ORM設置事務隔離級別。 – thelinuxer 2010-10-20 12:58:18