我有一个类似于chat roulette的应用程序,用户是随机匹配的。我在数据库级别上通过将两个用户与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条答案
按热度按时间0lvr5msh1#
1.如果A、B、C同时进行查询,并且您希望只有一个可以获得记录,如user.looking == true,只需更新记录,pg实际上将在这里执行三个步骤
假设A正在进行更新,B希望同时更新记录,B将在更新记录步骤阻塞。看起来A锁定了记录,实际上MVCC阻塞了来自B的更新。更新使用ROW EXCLUSIVE锁锁定表,ROW EXCLUSIVE不阻塞ROW EXCLUSIVE锁。
当A B同时更新时: