PostgreSQL 乐观读(相当于 SQL Server 的 Read Commited Snapshot)

neo*_*112 2 postgresql concurrency locking isolation-level

PostgreSQL 是否提供内置的乐观并发控制机制,例如 SQL Server 的读提交快照隔离?读者可以在不阻塞的情况下读取所有行,但如果在事务期间修改了行,则写入将阻塞并失败。

编辑:在 RCSI 下,写入实际上不会“阻塞并失败”,而只是阻塞。

小智 5

这就是 Postgres 的从头开始设计的方式(与 SQL Server 不同,SQL Server 是很晚才添加的)

详细信息请参阅手册:http://www.postgresql.org/docs/current/static/mvcc-intro.html

您实际上无法配置 Postgres,以便读取器阻止写入器(自动或隐式)

在 Postgres 中阻止读访问的唯一方法是(手动)以独占方式锁定整个表 ( lock table foo access exclusive)。

这将阻止对表的任何访问(不仅仅是单个行)。


与 SQL Server 不同的是,Postgres 也没有锁升级,即当超过某个行锁阈值时,整个表将被锁定以进行写入。

因此,仅仅因为一个事务更新了表中所有行的 95%(从而为其他写入者锁定了它们),并不意味着其他事务无法更新剩余的 5% - 使用 SQL Server,您很可能会这样做最终导致锁升级锁定整个表。