试图了解事务隔离级别如何在 SQL Server 内存优化表(内存中 oltp)上工作。
如果我执行以下查询:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks
Run Code Online (Sandbox Code Playgroud)
显示错误消息:
只有自动提交事务才支持使用 READ COMMITTED 隔离级别访问内存优化表。它不支持显式或隐式事务。使用表提示为内存优化表提供受支持的隔离级别,例如 WITH (SNAPSHOT)。
现在,如果我通过添加表提示来修改查询,它会起作用:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks WITH(SNAPSHOT)
Run Code Online (Sandbox Code Playgroud)
但是,如果我通过更改事务隔离级别SET TRANSACTION ISOLATION LEVEL SNAPSHOT并删除表提示:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks
Run Code Online (Sandbox Code Playgroud)
它不再工作,显示错误消息:
当会话 TRANSACTION ISOLATION LEVEL 设置为 SNAPSHOT 时,无法访问或创建内存优化表和本机编译模块。
为什么它与表提示一起工作,并通过设置事务隔离级别
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Run Code Online (Sandbox Code Playgroud)
才不是?
更新:尝试设置MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT为ON,仍然从上次查询中得到相同的错误:
当会话 …
sql-server snapshot-isolation memory-optimized-tables sql-server-2016 in-memory-oltp
sql-server ×1