簡體   English   中英

查詢中的鎖順序(PostgreSQL)

[英]Order of locks in query (postgresql)

數據庫具有表X和從X繼承的表An,Bn,Cn,Dn。

進程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鎖定An,則出現死鎖。

是否有有關PostgreSQL查詢中鎖定表順序的信息(無顯式鎖定)? 還是可能有其他解決方案?

我知道您說的沒有顯式鎖定,但老實說,您最好的選擇顯式鎖定。 由於這兩個批處理中的第一條語句都有一個lock命令,該命令將鎖定您將要使用的表。 與此有關的最重要的部分是,兩個lock命令必須以相同的順序鎖定表,否則無論如何您將再次陷入死鎖。

在此之后,請確保兩個批處理都盡可能快地運行,因為您要使用表級別的鎖……您不想持有它們的時間超過了必須的時間。

是否有有關PostgreSQL查詢中鎖定表順序的信息(無顯式鎖定)? 還是可能有其他解決方案?

通常,PostgreSQL的mvcc實現會使您免受許多類型的死鎖的困擾。 有關更多詳細信息,請參見http://www.postgresql.org/files/developer/transactions.pdf

但是,一種常見的解決方案是僅處理死鎖,也就是說,如果查詢由於死鎖而失敗,請重試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM