official example here中,我们将SET TRANSACTION ISOLATION LEVEL与显式定义的事务结合使用。

我的问题是,如果我从SqlCommand执行查询,例如:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * from MyTable


我将从设置的新隔离级别中受益吗?

还是我需要像这样显式定义事务?

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRANSACTION;
    SELECT * from MyTable
COMMIT TRANSACTION;


更新:
按照Randy Levy's answer,我将更新查询,如下所示:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * from MyTable;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;


这是为了克服possible isolation level leaks when using pooling

最佳答案

是的,即使不在显式BEGIN TRANSACTION中,您也会从设置的事务隔离级别中受益。设置事务隔离级别时,将在连接级别上进行设置。

SET TRANSACTION ISOLATION LEVEL (Transact-SQL)


  一次只能设置一个隔离级别选项,并且
  保持为该连接设置的状态,直到明确更改为止。


可能发生的一个“陷阱”(问题)是,使用池化时,隔离级别可能会在不同的连接之间泄漏。如果要在一个(或某些)特定代码段中显式设置隔离级别(但使用默认的大多数其他位置)并使用连接池。如果代码期望默认隔离级别“ A”但获得的隔离级别已明确设置为“ B”,则这可能会导致奇怪的问题。

看来此问题已在更高版本的SQL Server中得到解决:SQL Server: Isolation level leaks across pooled connections

关于c# - SET TRANSACTION ISOLATION LEVEL仅适用于交易吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39988583/

10-13 02:16