在内存优化表上使用 TransactionScope 时出现“事务隔离级别设置为快照”错误

问题描述 投票:0回答:1

在 SQL Server 上的内存磁盘设置中,如下所示

快照_隔离_状态 snapshot_isolation_state_desc is_read_comfilled_snapshot_on is_memory_optimized_elevate_to_snapshot_on 启用内存优化
1 1 1 1

下面用于设置和完成交易的代码

var transactionOptions = new TransactionOptions();
                    transactionOptions.IsolationLevel = IsolationLevel.Snapshot;

using (var transaction = new TransactionScope(TransactionScopeOption.RequiresNew, transactionOptions))
    {
        this.Service.Set(object);
        transaction.Complete();
    }

但是在 transaction.Complete() 上会抛出此错误:

Microsoft.Data.SqlClient.SqlException (0x80131904):当会话事务隔离级别设置为 SNAPSHOT 时,无法访问或创建内存优化表和本机编译的模块。

据我了解,如果

is_memory_optimized_enabled
is_memory_optimized_elevate_to_snapshot_on
设置为 true 我应该能够使用
IsolationLevel.Snapshot

我设置了内存中的数据库,创建了内存优化表,然后在代码中使用TransactionScope尝试写入数据库。

我更愿意使用SNAPSHOT,因为 READCOMMITTED 存在间歇性的锁定问题。

READCOMMITTED 适用于重试逻辑,但更适合我们 SNAPSHOT。

c# transactionscope isolation-level memory-optimized-tables
1个回答
0
投票

如果我理解正确,问题是你不能同时指定两者:

  • MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT
    1
  • 隔离级别
    Snapshot

同时。

当您使用

MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT
时,您将继续照常使用 ReadCommissed

这确实有点令人困惑,但是当您同时使用基于磁盘和内存中的对象进行事务时,这会更有意义。

锁定问题

对于您的锁定问题:

我更愿意使用

SNAPSHOT
- 因为
READ COMMITTED
间歇性出现锁定问题。

首选解决方案是打开:

READ_COMMITTED_SNAPSHOT = 1

这个功能有点像“内存优化提升到快照”:

  • memory-optimized
    提升到快照
  • read-committed
    提升到快照

这意味着如果您在

READ_COMMITTED
模式下运行,您将免费获得
SNAPSHOT
隔离启用。

所以现在你有:

  • 内存优化表提升为快照
  • 并且已提交的事务提升到快照
© www.soinside.com 2019 - 2024. All rights reserved.