5

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

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

4

2 回答 2

3

如果您真的想在引用传统表和内存优化表时了解 In-Memory 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 部分/

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

于 2019-03-24T03:07:15.907 回答
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;
于 2019-03-03T11:23:49.690 回答