SQL Server中的事务隔离级别

5
我试图更新一个控制应用程序的表格(应用程序执行一些选择语句)。我希望在设置为读取未提交的隔离级别的事务中更新表格,因此如果应用程序不能按预期工作,我可以回滚事务。但是以下代码不起作用:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
go

begin transaction 
go

update [DB].[dbo].[Table] 
set ID = ID - 281 
where ID > 2

当我打开另一个查询窗口时,我无法查询这个表格…… 我认为,以这样的事务级别,我应该能够在不回滚/提交事务的情况下查询表格。

1
你不是忘记在最后提交或回滚了吗? - Magnus
你尝试过在选择查询中提供相同的提示而不是更新查询吗? - Ven
2个回答

3
你需要在读取数据的会话中使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT *
FROM [DB].[dbo].[Table]

这个查询将立即执行,不会锁定数据。您将看到脏数据。


谢谢您的回答。它解决了问题,但我不能接受两个答案 :( 但已点赞。 - Michał Turczyn

3

隔离级别的工作方式与您想象的不同。

您只能读取未提交的数据,但其他人在事务提交之前仍然无法看到您所做的任何更改。

如果您想要在选择中查看此事务中的未提交数据,则需要设置

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

转换为这个选择


1
这也会使查询读取应用程序中的任何其他未提交数据,所以要小心。 - Magnus
1
@Magnus 确实,脏读可能很危险,所以要小心使用。如果有机会,尽量避免使用它们。 - michal.jakubeczy
2
我认为Magnus想说的是,如果您只想查看一个表中未提交的数据,则不应更改整个事务的隔离级别,而是可以在感兴趣的表上使用with(nolock)提示。 - sepupic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接