天天看點

PostgreSQL 使用advisory lock實作行級讀寫堵塞

postgresql , select for update , 讀寫沖突 , 讀寫堵塞 , advisory lock

postgresql的讀寫是不沖突的,這聽起來是件好事對吧,讀和寫互相不幹擾,可以資料庫提高讀寫并發能力。

但是有些時候,使用者也許想讓讀寫沖突(需求:資料正在被更新或者删除時,不允許被讀取)。

那麼有方法能實作讀寫沖突嗎?

postgresql提供了一種鎖advisory lock,可以實作讀寫堵塞的功能。

1. 建立表,注意使用一個唯一id(用于advisory lock)

2. 插入測試資料

3. 會話1,更新某一條記錄

4. 會話2,讀這條記錄

使用以上正常的方法,讀寫是不沖突的。

5. 會話1,更新這條記錄的同時,使用advisory lock鎖住這個id

6. 會話2,查詢這條記錄時,使用advisory lock探測這條記錄,如果無法加鎖,傳回0條記錄。進而實作讀寫堵塞(實際上是隔離)。

使用advisory lock,實作了讀寫沖突的需求(實際上是讓讀的會話讀不到被鎖的記錄)。

advisory lock鎖住的id,是庫級沖突的,是以使用時也需要注意喲。

<a href="https://www.postgresql.org/docs/9.6/static/explicit-locking.html#advisory-locks">https://www.postgresql.org/docs/9.6/static/explicit-locking.html#advisory-locks</a>

<a href="https://www.postgresql.org/docs/9.6/static/functions-admin.html#functions-advisory-locks">https://www.postgresql.org/docs/9.6/static/functions-admin.html#functions-advisory-locks</a>

繼續閱讀