SERIALIZABLE 隔离
SERIALIZABLE
是最严格的 SQL 事务隔离级别。尽管此隔离级别允许事务并发运行,但在它的影响下,事务实际上会按序列顺序运行。事务会为读取和写入操作获取锁。因此,一个事务内的连续 SELECT
命令始终会产生相同的结果。由于 SERIALIZABLE
隔离提供了一致的数据视图,它对要求复杂查询和更新的应用程序十分有用。但是,可序列化隔离会降低并发性。例如,它会在批量加载期间禁止执行查询操作。
SERIALIZABLE
隔离会建立以下锁:
-
表级别读取锁:Vertica 会在所选表上获取表级别读取锁,并在事务结束时释放这些锁。此行为可防止在一个事务读取行期间,另一个事务修改行。
-
表级别写入锁:Vertica 会在更新时获取表级别写入锁,并在事务结束时释放这些锁。此行为可防止在一个事务对行的更改尚未提交时,另一个事务读取这些行更改。
在事务开始时,SELECT
语句会获取所选内容中已提交数据的备份。事务也会查看在事务内运行的更新操作的结果,然后再提交这些更新。
下图显示了都具有 SERIALIZABLE
隔离级别的并发事务如何处理锁定:
使用 SERIALIZABLE
的应用程序必须准备好在序列化失败后重试事务。此类失败通常是由于死锁导致的。死锁发生时,等待锁的所有事务都会在 5 分钟后自动超时。下图显示了死锁的发生方式以及 Vertica 如何处理死锁:
注意
SERIALIZABLE
隔离不会应用于临时表。这些表不需要锁,因为它们被隔离在各自的事务范围内。