在 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。
如果我理解正确,问题是你不能同时指定两者:
1
Snapshot
同时。
当您使用
MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT
时,您将继续照常使用 ReadCommissed。
这确实有点令人困惑,但是当您同时使用基于磁盘和内存中的对象进行事务时,这会更有意义。
对于您的锁定问题:
我更愿意使用
- 因为SNAPSHOT
间歇性出现锁定问题。READ COMMITTED
首选解决方案是打开:
READ_COMMITTED_SNAPSHOT = 1
这个功能有点像“内存优化提升到快照”:
memory-optimized
提升到快照read-committed
提升到快照这意味着如果您在
READ_COMMITTED
模式下运行,您将免费获得 SNAPSHOT
隔离启用。
所以现在你有: