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

时间:2019-03-03 10:59:10

标签: sql-server sql-server-2016 memory-optimized-tables snapshot-isolation in-memory-oltp

试图了解事务隔离级别如何在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时,无法访问或创建内存优化表和本机编译模块。

2 个答案:

答案 0 :(得分:0)

必须使用MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT数据库选项才能使用没有提示的显式SNAPSHOT事务。以下是https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/development/single-page-application-with-ad-fs(强调我的意思):

  

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

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

ALTER DATABASE YourDatabase
    SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;

答案 1 :(得分:0)

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

所有这些都在我的帖子中详细介绍:

http://nedotter.com/archive/2017/08/all-about-in-memory-isolation-levels-part-1/ http://nedotter.com/archive/2017/08/all-about-in-memory-isolation-levels-part-2/

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