在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/