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>