我有一系列类似于以下内容的SQL语句:
BEGIN;
SELECT counter FROM table WHERE id=X FOR UPDATE;
REALLY COMPLEX QUERY;
UPDATE table SET counter=Y WHERE id=X;
END;
我想防止在重新计算计数器值时读取该计数器,但是根据Postgres的文档,“行级锁不影响数据查询;它们仅阻止写入同一行的写入器。”
问题:
- 如果不阻止读取,那么“排他性”行锁又有什么意义呢?只是为了防止其他事务获取共享锁吗?
- 如果我使用SELECT ... FOR SHARE读取该行,是否会达到与“排他”锁相同的效果?
- 是否可以为表/模式/数据库关闭MVCC并允许就地写入?