我正在尝试使用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
}
}
我得到了SERIALIZABLE的结果。有没有办法在事务中运行查询并将隔离级别更改为read uncommitted?
答案 0 :(得分:3)
您要使用的是TransactionScopeOption.RequiresNew
。 Supress
选项会使封闭块在没有环境事务的情况下运行,也不会创建新的封闭块。这就是它的作用。
RequiresNew
会导致创建新的根事务范围。
请参阅this article中的摘要表,了解不同选项的行为方式。
有关Suppress
的更多信息:
当您想要保留执行的操作时,抑制非常有用 由代码部分,并不想中止环境事务 如果操作失败。例如,当您要执行日志记录时 或审核操作,或者您希望向订阅者发布事件时 无论您的环境事务是提交还是中止。