内存优化表中的事务隔离级别

访问内存优化表的事务支持的隔离级别如下。

  • 快照

  • 可重复读取

  • 序列 化

  • READ COMMITTED(读已提交)

事务隔离级别可以指定为本机编译存储过程的原子块的一部分。 有关详细信息,请参阅 CREATE PROCEDURE (Transact-SQL)。 在从解释的 Transact-SQL 中访问内存优化表时,可以使用表级提示来指定隔离级别。

定义本机编译的存储过程时,必须指定事务隔离级别。 从解释的 Transact-SQL 中的用户事务访问内存优化表时,必须在表提示中指定隔离级别。 有关详细信息,请参阅 Memory-Optimized 表的事务隔离级别指南

使用自动提交事务的内存优化表支持隔离级别 READ COMMITTED。 READ COMMITTED 在用户事务或原子块中无效。 READ COMMITTED 不支持显式或隐式用户事务。 对于具有自动提交事务的内存优化表,仅当查询无法访问任何基于磁盘的表时,才支持隔离级别READ_COMMITTED_SNAPSHOT。 此外,使用解释执行的 Transact-SQL 和 SNAPSHOT 隔离启动的事务无法访问内存优化表。 通过使用解释 Transact-SQL 以及 REPEATABLE READ 或 SERIALIZABLE 隔离的事务,必须使用 SNAPSHOT 隔离来访问内存优化表。 有关此方案的详细信息,请参阅 跨容器事务

READ COMMITTED 是 SQL Server 中的默认隔离级别。 会话的隔离级别为 READ COMMITTED(或更低),您可以选择以下之一:

  • 显式使用更高的隔离级别提示来访问内存优化表(例如 WITH(SNAPSHOT)。

  • 指定 MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT set 选项,该选项将会把内存优化表的隔离级别设置为 SNAPSHOT(相当于为每个内存优化表加上 WITH(SNAPSHOT) 提示)。 有关详细信息MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT,请参阅 ALTER DATABASE SET 选项(Transact-SQL)。

或者,如果会话的隔离级别为 READ COMMITTED,则可以使用自动提交事务。

在解释模式 Transact-SQL 中启动的 SNAPSHOT 事务无法访问内存优化表。

内存优化表支持的事务隔离级别提供与基于磁盘的表相同的逻辑保证。 用于提供隔离级别保证的机制是不同的。

对于基于磁盘的表,大多数隔离级别保证都使用锁定来实现,从而通过阻止来防止冲突。 对于内存优化表,使用冲突检测机制强制执行保证,从而避免需要锁定。 例外情况是磁盘基础表上的快照隔离。 这类似于将 SNAPSHOT 隔离应用于内存优化表,并使用冲突检测机制。

快照
此隔离级别指定事务中任何语句读取的数据将是事务开始时存在的数据的事务一致性版本。 该事务只能识别在事务开始前提交的数据修改。 在当前事务中执行的语句看不到在当前事务开始以后由其他事务所做的数据修改。 事务中的语句获取事务开始时已提交的数据的快照。

写操作(更新、插入和删除)始终与其他事务完全隔离。 因此,SNAPSHOT 事务中的写入操作可能会与其他事务的写入操作发生冲突。 当当前事务尝试更新或删除由当前事务启动后提交的另一个事务更新或删除的行时,该事务将终止并显示以下错误消息。

错误 41302。 当前事务尝试更新自此事务启动以来已更新的表 X 中的记录。 事务已中止。

当当前事务尝试插入与在当前事务之前提交的另一个事务插入的行相同的主键值的行时,将失败并显示以下错误消息。

错误 41325。 由于可序列化的验证失败,当前事务未能提交。

如果事务写入到在事务提交之前删除的表,则事务将终止并显示以下错误消息:

错误 41305。 由于可重复读取验证失败,当前事务未能提交。

可重复读取
此隔离级别包括 SNAPSHOT 隔离级别提供的保证。 此外,REPEATABLE READ 保证对于事务读取的任何行,在事务提交该行时,任何其他事务都没有更改该行。 事务中的每个读取操作在事务结束前都是可重复的。

如果当前事务已读取的某行已被另一个在当前事务之前提交的事务更新,则提交失败并显示以下错误消息。

错误 41305。 由于可重复读取验证失败,当前事务未能提交。

序列 化
此隔离级别包括 REPEATABLE READ 提供的保证。 快照和事务末尾之间没有出现虚拟行。 虚拟行与选择、更新或删除的筛选条件匹配。

该事务的执行就像没有并发事务一样。 所有动作实质上都发生在一个序列化点(提交时)。

如果违反上述任何保证,则事务无法提交并会出现以下错误消息:

错误 41325。 由于可序列化的验证失败,当前事务未能提交。

另请参阅

了解 Memory-Optimized 表上的事务
Memory-Optimized 表的事务隔离级别指南
Memory-Optimized 表上的事务重试逻辑指南