Postgres、MVCC 和锁定

Kev*_*vin 9 postgresql locking

我有一系列 SQL 语句,如下所示:

BEGIN;
SELECT counter FROM table WHERE id=X FOR UPDATE;
REALLY COMPLEX QUERY;
UPDATE table SET counter=Y WHERE id=X;
END;
Run Code Online (Sandbox Code Playgroud)

我想防止在重新计算计数器值时读取计数器,但根据 Postgres 文档“行级锁不影响数据查询;它们只阻止写入者到同一行。”

问题:

  1. 如果不阻止读取,“排他”行锁有什么意义?难道只是为了防止其他事务获取共享锁?
  2. 如果我使用 SELECT ... FOR SHARE 读取该行,是否达到与“排他”锁相同的效果?
  3. 是否可以关闭表/模式/数据库的 MVCC 并允许就地写入?

j.p*_*.p. 6

到 1) 只要您的事务没有提交,任何其他会话都会像在“BEGIN”语句之前一样读取由您的事务修改的数据。一旦您的事务提交,它将读取计数器的新值。关键是其他人不必等待并且将始终看到一致的数据库。

to 2), 3) 为什么不试试“ACCESS EXCLUSIVE”呢?(见http://www.postgresql.org/docs/current/static/explicit-locking.html

编辑:如果您不喜欢使用“ACCESS EXCLUSIVE”锁锁定整个表,您也可以使用“Advisory Lock”(请参阅​​上面链接中的第 13.3.4 节)。