在有shared/exclusive个锁的数据库中,当事务开始时执行UPDATE语句时,锁是如何工作的?

In a database with shared/exclusive locks, when an UPDATE statement is executed at the beginning of the transaction, how do the locks work?

在具有shared/exclusive锁的数据库中,当在事务开始时执行UPDATE语句时,锁是如何工作的?假设是Repeatable Read或者更高,是在读查找阶段获得共享锁然后获得排他锁,还是一开始就获得排他锁?假设 Read Committed,UPDATE 语句是只在写入阶段获得独占锁,还是一开始读取就获得它?我正在使用 PostgreSQL。

当 PostgreSQL 在 table 中扫描满足 UPDATEWHERE 条件的行时,它根本不会锁定行。只有当找到候选行时,它才会将其锁定在 EXCLUSIVE 模式。如果不能立即获取锁,并且 UPDATE 被阻塞,PostgreSQL 等待直到它可以获取锁,然后再次读取该行。行为取决于隔离级别:

  • READ COMMITTED,如果最新行版本仍然满足WHERE条件,则锁定

  • with REPEATABLE READ or SERIALIZABLE, 如果行已经改变,你得到一个序列化错误并且必须重试事务

这一切is well documented