數據庫中有表X和表的,BN,CN,DN,從X.訂單查詢(PostgreSQL的)鎖
過程1個查詢週期性地從X.
數據過程2繼承的更新子表中的數據。例如,要更新表An和Bn,它會創建新的表Am和Bm,將數據加載到它們中,鎖定訪問專用An,Bn,並將An和Bn放入並更改Am和Bm以繼承X.
問題是當進程1執行查詢時(例如select * from X
)它以共享模式鎖定表An,Bn,Cn,Dn,並且鎖定順序未知。如果進程1鎖定了Bn,那麼進程2鎖定我們有死鎖。
有沒有關於在postgresql查詢鎖定表的順序(沒有顯式鎖定)?或者可能有其他解決方案是可能的?
SELECT不鎖定表格,除非您明確要求鎖定。你有沒有檢查pg_locks來看看發生了什麼? http://www.postgresql.org/docs/8.4/interactive/view-pg-locks.html – 2010-06-28 06:28:01
SELECT鎖表(http://www.postgresql.org/docs/8.1/static/explicit-locking.html) ,並在我的情況下,它與專門請求刪除的訪問衝突。 訪問共享 僅與ACCESS EXCLUSIVE鎖定模式衝突。 SELECT和ANALYZE命令在引用的表上獲取此模式的鎖定。一般來說,任何只讀取一個表並且不修改它的查詢都會獲得這種鎖定模式。 – valodzka 2010-06-28 09:21:15
它因爲ACCESS EXCLUSIVE而發生衝突,那就是你的問題。 SELECT本身不是問題。 – 2010-06-28 11:08:14