【发布时间】:2021-10-11 00:57:11
【问题描述】:
我希望客户端会话锁定一个表,以便它可以继续读取和写入该表。同时其他客户端会话应该只能从表中读取。一旦锁被移除,那么所有客户端会话都应该被允许读取和写入表。此外,一旦锁定被删除,所有在锁定时尝试写入表的客户端会话都应该执行。我不希望在锁定期间尝试插入时引发任何错误。
我知道读锁不起作用,因为创建锁的客户端会话在锁存在时无法写入表。此外,写锁也不起作用,因为其他客户端会话无法从表中读取。我有什么办法可以做到这一点?
【问题讨论】:
-
锁定表很少见。写锁通常意味着排他锁,这意味着只有给定的连接才能访问表。在这种情况下,您可能必须实现应用程序级锁定。
-
您没有充分解释为什么标准
BEGIN; ((do read FOR UPDATE ... writes)) COMMIT;是不够的。注意FOR UPDATE。 -
@RickJames
BEGIN; ((do read FOR UPDATE ... writes)) COMMIT;似乎是一个不错的解决方案,只要其他客户端可以继续从表中读取。听起来他们可以根据比尔。