SERIALIZABLE 隔离

SERIALIZABLE 是最严格的 SQL 事务隔离级别。尽管此隔离级别允许事务并发运行,但在它的影响下,事务实际上会按序列顺序运行。事务会为读取和写入操作获取锁。因此,一个事务内的连续 SELECT 命令始终会产生相同的结果。由于 SERIALIZABLE 隔离提供了一致的数据视图,它对要求复杂查询和更新的应用程序十分有用。但是,可序列化隔离会降低并发性。例如,它会在批量加载期间禁止执行查询操作。

SERIALIZABLE 隔离会建立以下锁:

  • 表级别读取锁:Vertica 会在所选表上获取表级别读取锁,并在事务结束时释放这些锁。此行为可防止在一个事务读取行期间,另一个事务修改行。

  • 表级别写入锁:Vertica 会在更新时获取表级别写入锁,并在事务结束时释放这些锁。此行为可防止在一个事务对行的更改尚未提交时,另一个事务读取这些行更改。

在事务开始时,SELECT 语句会获取所选内容中已提交数据的备份。事务也会查看在事务内运行的更新操作的结果,然后再提交这些更新。

下图显示了都具有 SERIALIZABLE 隔离级别的并发事务如何处理锁定:

使用 SERIALIZABLE 的应用程序必须准备好在序列化失败后重试事务。此类失败通常是由于死锁导致的。死锁发生时,等待锁的所有事务都会在 5 分钟后自动超时。下图显示了死锁的发生方式以及 Vertica 如何处理死锁:

另请参阅 Vertica