gpt4 book ai didi

.net - 为什么在 .net 中使用 TransactionScopeOption.Suppress 时会忽略隔离级别

转载 作者:行者123 更新时间:2023-12-03 03:24:19 27 4
gpt4 key购买 nike

我正在尝试使用 LINQ TO SQL 在现有事务中执行具有未提交读取隔离级别的查询。如果我使用该选项从父事务中抑制此事务,那么我似乎失去了指定隔离级别的能力。在 LINQPad 中使用此代码:

void Main()
{
var db = this;
db.ExecuteQuery<string>(@"SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");

using (var trans = new TransactionScope(TransactionScopeOption.Required))
{
// updates or inserts here

using (new TransactionScope(TransactionScopeOption.Suppress,
new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
{
db.ExecuteQuery<string>(@"SELECT CASE transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN 'ReadUncomitted'
WHEN 2 THEN 'Readcomitted'
WHEN 3 THEN 'Repeatable'
WHEN 4 THEN 'Serializable'
WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL
FROM sys.dm_exec_sessions
where session_id = @@SPID
").Dump("Inside the transaction");

}
// updates or inserts here
}
}

我得到了可串行化的结果。有没有办法在事务内运行查询并将隔离级别更改为读取未提交?

最佳答案

您要使用的是TransactionScopeOption.RequiresNewSupress 选项使您的封闭 block 在没有环境事务的情况下运行,也无需创建新的事务。这就是它的作用。

RequiresNew 导致创建一个新的根事务范围。

参见 this article 中的汇总表关于不同选项的行为方式。

有关抑制的更多信息:

Suppress is useful when you want to preserve the operations performed by the code section, and do not want to abort the ambient transaction if the operations fail. For example, when you want to perform logging or audit operations, or when you want to publish events to subscribers regardless of whether your ambient transaction commits or aborts.

关于.net - 为什么在 .net 中使用 TransactionScopeOption.Suppress 时会忽略隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16743347/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com