我有一个类似聊天轮盘的应用,用户随机匹配。我通过将两个用户与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)更新它
没有其他线程发现相同记录的风险。
答案 0 :(得分:0)
如果A B C同时进行查询,而你想只有一个可以得到像user.looking == true这样的记录,只需更新记录,pg实际上会在这里做三步
假设A进行更新,B想要同时更新记录,B将在更新记录步骤中阻止。看起来A锁定了记录,实际上MVCC阻止了B的更新。用ROW EXCLUSIVE锁更新锁表,而ROW EXCLUSIVE不阻塞ROW EXCLUSIVE锁。
当A B同时更新时: