试图了解事务隔离级别如何在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时,无法访问或创建内存优化表和本机编译模块。
答案 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/
如果您对这个经常被误解的话题还有其他疑问,请告诉我。