天天看点

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>

继续阅读