ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;并发控制技术主要有三种:严格两阶段封锁(S2PL)、多版本并发控制(MVCC)和乐观并发控制(OCC)。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在MVCC中,每次写入操作都会创建数据项的新版本,同时保留旧版本。当事务读取数据项时,系统选择其中一个版本以确保单个事务的隔离。**MVCC最大的特点是读写互不阻塞**。**PostgreSQL使用了称为快照隔离(SI)的 MVCC 变体结合封锁技术进行并发控制。** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了实现SI,一些RDBMS(例如Oracle)使用回滚段。写入新数据项时,该项的旧版本将写入回滚段,随后新项将覆盖到数据区域。PostgreSQL使用更简单的方法。**新的数据项将直接插入到相关的表页中。在读取项目时,PostgreSQL通过应用可见性检查规则选择项目的适当版本以响应单个事务**。SI可以杜绝脏读、不可重复读、幻读,但SI 无法实现真正​​的可序列化,因为它允许序列化异常,例如 Write Skew 和 Read-only Transaction Skew。为了解决这个问题,从 9.1 版开始添加了可序列化快照隔离 (SSI)。 SSI 可以检测序列化异常并解决此类异常引起的冲突。因此,PostgreSQL 9.1 及更高版本提供了真正的 SERIALIZABLE 隔离级别。 (另外,SQL Server 也使用 SSI,Oracle 仍然只使用 SI) <br> > 快照隔离是事务处理和数据库中的一个属性,它保证在一个事务中进行的所有读取都能看到同一个数据库“快照”。这意味着,如果事务的更新与任何其他并发更新不冲突,则事务将承诺成功处理请求。快照隔离是一个用于多版本并发的控制算法,它提供了隔离级别,从而避免了在并发时经常出现的问题 <br> **MVCC的实现方法有两种:** 1. 写新数据时,把旧数据移到一个单独的地方,如回滚段中,其他人读数据时,从回滚段中把旧的数据读出来; 2. 写数据时,旧数据不删除,而是把新数据插入。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostgreSQL数据库使用第二种方法,而Oracle数据库和MySQL中的innodb引擎使用的是第一种方法。与oracle数据库和MySQL中的innodb引擎相比较,PostgreSQL的MVCC实现方式的优缺点如下。 优点: 1. 事务回滚可以立即完成,无论事务进行了多少操作; 1. .数据可以进行很多更新,不必像Oracle和MySQL的Innodb引擎那样需要经常保证回滚段不会被用完,也不会像oracle数据库那样经常遇到“ORA-1555”错误的困扰;    缺点: 1. 旧版本数据需要清理。PostgreSQL清理旧版本的命令成为Vacuum; 1. 旧版本的数据会导致查询更慢一些,因为旧版本的数据存在于数据文件中,查询时需要扫描更多的数据块。