【发布时间】:2017-01-08 04:24:05
【问题描述】:
我有一个类似于聊天轮盘赌的应用程序,其中用户是随机匹配的。我通过将两个用户与 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) 更新它
没有另一个线程找到相同记录的风险。
【问题讨论】:
-
只需更新它 - 它会自动锁定。
标签: postgresql