Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET/Entity Framework for SQL Server中设置事务隔离级别_C#_.net_Tsql_Transactions_Isolation Level - Fatal编程技术网

C# 在.NET/Entity Framework for SQL Server中设置事务隔离级别

C# 在.NET/Entity Framework for SQL Server中设置事务隔离级别,c#,.net,tsql,transactions,isolation-level,C#,.net,Tsql,Transactions,Isolation Level,我正在尝试在.NET/C中为事务设置事务隔离级别。我正在使用以下代码设置交易: using (var db = new DbContext("ConnectionString")) { using (var transaction = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { IsolationLevel = IsolationL

我正在尝试在.NET/C中为事务设置事务隔离级别。我正在使用以下代码设置交易:

 using (var db = new DbContext("ConnectionString"))
 {
     using (var transaction = new TransactionScope(TransactionScopeOption.RequiresNew, 
             new TransactionOptions() { IsolationLevel = IsolationLevel.Snapshot }))
     {
         ...code here

         transaction.Complete();
     }
 }
使用SQL Server Profiler,这将产生以下结果:

set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
为什么在我特别请求“快照”时将隔离级别设置为“读取已提交”

已为相关数据库启用快照隔离

此“读取已提交”正被另一个长时间运行的事务阻止

在SQLServerManagementStudio中运行以下代码在长时间运行的事务中工作正常,但是上面的代码被阻止,因为隔离级别正在从我指定的级别更改

USE <database>;
GO
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO
BEGIN TRANSACTION;
GO

<SELECT STATEMENT>

GO
COMMIT TRANSACTION;
GO
为什么?

新TransactionScope只需将Transaction.Current设置为当前。这就是它的全部功能。现在,任何想要支持事务的人都可以查看该属性并登记。通常的DbConnection类在打开时登记。显然,您的代码在此特定范围下不会打开连接


System.Transactions没有内置的对更改隔离级别的支持,这是一个令人遗憾的遗漏。你需要自己去做。

我不确定我是否能做到。您似乎在说,即使new TransactionScope接受TransactionOptions的参数,这些选项也不会被使用?那没有任何意义。外部作用域var db只是一个DbContext。这不会打开连接吗?有没有一种方法可以让我重写它以获得我期望的行为?如何更改事务的隔离级别?在使用transaction.Current时使用参数没有任何意义。但没有人关注这个价值。您的外部范围与事务无关。通常,EF会为每个DB操作打开一个新连接。如果你想要更多的细节,发布更完整的代码。这基本上是我的完整代码。这是我的问题。我做错了什么?我希望我的select语句在下面这样说,以便为select使用快照事务。我该怎么做?using var db=new DbContextConnectionString{using var transaction=new TransactionScopeTransactionScopeOption.RequiresNew,new TransactionOptions{IsolationLevel=IsolationLevel.Snapshot}{db.Person.ToList;transaction.Complete;}确定,实例化作用域内的上下文是一个不太可能的修复。除此之外,这应该是可行的。也许我们不能完全信任profiler。TDS协议有一种不用SQL设置隔离级别的方法。也许它没有出现。执行select isolevel from sys.sessions,其中id=@@SPID位于范围内,以确保安全。或者,将探查器设置为显示TM manager事件。将探查器设置为显示TM manager事件没有显示任何内容,但我认为我发现了问题。我无意中使用了TransactionScopeOption.Suppress而不是TransactionScopeOption.RequireRenew。此外,我将事务块移动到新的DbContext块的作用域。