SQL Server 内存中 oltp 事务快照隔离

gio*_*gio 5 sql-server snapshot-isolation memory-optimized-tables sql-server-2016 in-memory-oltp

试图了解事务隔离级别如何在 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_SNAPSHOTON,仍然从上次查询中得到相同的错误:

当会话 TRANSACTION ISOLATION LEVEL 设置为 SNAPSHOT 时,无法访问或创建内存优化表和本机编译模块。

小智 6

如果您确实想了解引用传统表和内存优化表时内存中 OLTP 支持的隔离级别,您还必须了解事务启动模式。

所有这些都在我的帖子中详细说明:

http://nedotter.com/archive/2017/08/all-about-in-memory-isolation-levels-part-1/ http://nedotter.com/archive/2017/08/all-about-in-内存隔离级别-第 2 部分/

如果您对这个经常被误解的话题还有其他疑问,请告诉我。


Dan*_*man 4

必须打开数据库MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT选项才能使用SNAPSHOT没有提示的显式事务。以下是文档的摘录(重点是我的):

显式 - Transact-SQL 包含代码 BEGIN TRANSACTION 以及最终的 COMMIT TRANSACTION。两个或多个语句可以合并到同一事务中。在显式模式下,必须使用数据库选项 MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT 或在 FROM 子句中编写有关内存优化表上的事务隔离级别的表提示。

下面的示例显示了如何打开此数据库选项:

ALTER DATABASE YourDatabase
    SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;
Run Code Online (Sandbox Code Playgroud)