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