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_SNAPSHOT为ON,仍然从上次查询中得到相同的错误:
当会话 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 部分/
如果您对这个经常被误解的话题还有其他疑问,请告诉我。
必须打开数据库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)