我知道 PostgreSQL 为并发控制提供了多种锁定模式。当我阅读他们的文件时,我看不出为什么ACCESS EXCLUSIVE
无论如何都需要锁。EXCLUSIVE
锁和锁之间的唯一区别ACCESS EXCLUSIVE
似乎是ACCESS EXCLUSIVE
锁不允许从表中读取。
但是,人们能够阅读不是一件好事吗?在什么情况下你应该阻止用户阅读?在我看到的文档中,通常DROP TABLE
等会使用ACCESS EXCLUSIVE
锁,但为什么呢?我在想,也许当你删除一个表时,当你试图读取时,数据已经部分消失了,所以结果会被破坏。但后来我意识到,由于 Postgres 中的所有内容都是事务性的,因此 aDROP TABLE
不应该在提交之前生效。所以我的猜测应该是错误的。
我仍然很困惑。当您将其与锁定进行比较时,为什么ACCESS EXCLUSIVE
再次需要EXCLUSIVE
锁定?我最好的猜测是,用ACCESS EXCLUSIVE
锁替换锁EXCLUSIVE
不会破坏 PostgreSQL。只是有时人们不想让别人阅读。我错过了什么?
如果您查看文档,您会看到获得此类锁的操作列表:
所有这些都是物理(重新)移动的行,因此在这些过程中读取至少是非常不可预测的。
谈到事务,当您开始从表中读取并且另一个进程稍后决定删除它时,后者必须等到读取完成 - 较早的仍然会获得请求的数据,并且当该事务提交时,第二个会获取锁定并放下桌子。反过来,在删除事务等待提交后读取将失败,因为不再有任何可读取的内容。
如果 PostgreSQL 允许从被删除的表中读取,那将意味着两件事。一个是,如果我没记错的话,存在一个
READ UNCOMMITTED
隔离级别。虽然您可以选择,但实际上READ COMMITTED
,这意味着没有交易能够看到其他交易的中间状态。另一个是,正如您已经猜到的那样,可能只返回了所需数据的一部分。这将导致不可预知的行为,这是您希望从数据库系统获得的最后一件事。此外,
CLUSTER
并且VACUUM FULL
正在两个文件之间移动数据 - 一个人如何决定在哪个文件中追踪行?总而言之,在某些情况下读取数据并不是那么紧急。或者在的情况下
DROP TABLE
,TRUNCATE
它不再那么紧急了。