在有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 中扫描满足 UPDATE
的 WHERE
条件的行时,它根本不会锁定行。只有当找到候选行时,它才会将其锁定在 EXCLUSIVE
模式。如果不能立即获取锁,并且 UPDATE
被阻塞,PostgreSQL 等待直到它可以获取锁,然后再次读取该行。行为取决于隔离级别:
和READ COMMITTED
,如果最新行版本仍然满足WHERE
条件,则锁定
with REPEATABLE READ
or SERIALIZABLE
, 如果行已经改变,你得到一个序列化错误并且必须重试事务
在具有shared/exclusive锁的数据库中,当在事务开始时执行UPDATE语句时,锁是如何工作的?假设是Repeatable Read或者更高,是在读查找阶段获得共享锁然后获得排他锁,还是一开始就获得排他锁?假设 Read Committed,UPDATE 语句是只在写入阶段获得独占锁,还是一开始读取就获得它?我正在使用 PostgreSQL。
当 PostgreSQL 在 table 中扫描满足 UPDATE
的 WHERE
条件的行时,它根本不会锁定行。只有当找到候选行时,它才会将其锁定在 EXCLUSIVE
模式。如果不能立即获取锁,并且 UPDATE
被阻塞,PostgreSQL 等待直到它可以获取锁,然后再次读取该行。行为取决于隔离级别:
和
READ COMMITTED
,如果最新行版本仍然满足WHERE
条件,则锁定with
REPEATABLE READ
orSERIALIZABLE
, 如果行已经改变,你得到一个序列化错误并且必须重试事务