Postgres:如何使用显式锁来防止读取?

时间:2017-01-08 04:24:05

标签: postgresql

我有一个类似聊天轮盘的应用,用户随机匹配。我通过将两个用户与user.looking == true

匹配来在数据库级别执行此操作

但是,如果用户A正在等待并且用户B和C同时继续,则这很容易受到攻击。

有没有办法锁定记录,以便在进行查询时无法读取记录?就像用户B首先进行SELECT * FROM users WHERE looking=true查询(将返回用户A)一样,我希望相同的查询不为用户C返回任何内容。

我在看这个:https://www.postgresql.org/docs/9.1/static/explicit-locking.html 但行级别锁看起来不像是在阅读吗?

  

除了表级锁外,还有行级锁,可以   是独家锁或共享锁。一个独家的行级锁定   更新行时自动获取特定行或   删除。锁定一直持续到事务提交或回滚,   就像表级锁一样。行级锁不会影响数据   查询;他们只阻止作者到同一行。

基本上我需要一种方法

1)查找记录

2)更新它

没有其他线程发现相同记录的风险。

1 个答案:

答案 0 :(得分:0)

  1. 如果A B C同时进行查询,而你想只有一个可以得到像user.looking == true这样的记录,只需更新记录,pg实际上会在这里做三步

    • 开始;
    • 更新记录
    • 提交;
  2. 假设A进行更新,B想要同时更新记录,B将在更新记录步骤中阻止。看起来A锁定了记录,实际上MVCC阻止了B的更新。用ROW EXCLUSIVE锁更新锁表,而ROW EXCLUSIVE不阻塞ROW EXCLUSIVE锁。

    当A B同时更新时:

    example here1

    example here2