SQL Server-非阻塞选择语句的隔离级别是多少?


9

我有一个运行很长时间的事务(称为T1),该事务在SQL Server 2008 R2中的表上执行一些删除,更新和插入操作。同时,另一个进程会定期运行该表中的select语句。

在默认隔离设置下(我认为是READ COMMITTED吗?),T1会阻止所有select语句运行,直到事务提交或回滚为止。

我希望看到的是即使事务正在进行中,select语句也可以在一致的数据上起作用。我相信SNAPSHOT隔离可以提供帮助,但是不确定我的方向是否正确。这是此应用程序的最佳隔离级别吗?

其次,我对调用select语句的过程没有任何控制,但对调用T1的.NET应用程序有控制。在select语句和T1上是否都需要进行任何隔离级别更改,或者仅将T1标记为具有不同的隔离级别就足够了吗?

Answers:


8

在理想的情况下,您将有两种选择,即SNAPSHOT和READ COMMITTED SNAPSHOT(RCSI)。在确定哪种隔离类型适合您的工作负载之前请确保您了解事务隔离级别的基础。特别要注意转移到RCSI可能会看到的不同结果

听起来这不是一个理想的世界,因为您无法控制正在生成select语句的应用程序。在这种情况下,您唯一的选择是为所涉及的数据库启用RCSI,以使选择项将自动使用RCSI而不是READ COMMITTED。


6

正确,使用SNAPSHOT隔离从事务开始之前获取一致的提交数据。

READ UNCOMMITTED隔离(又名NOLOCK提示)将读取dirtz,不一致的数据

启用S​​NAPSHOT隔离后,它将对以后的所有SELECT生效。ALTER DATABASE在这种情况下,您使用READ_COMMITTED_SNAPSHOT 运行

编辑:添加链接+引用的ALTER DATABASE(我的粗体)

在数据库级别启用“已提交读快照”选项。启用该功能后,即使没有事务使用快照隔离DML语句也会开始生成行版本。启用此选项后,指定读取的提交隔离级别的事务将使用行版本控制而不是锁定。当事务以读取的提交隔离级别运行时所有语句都会看到数据快照,因为它存在于语句开始处。

并来自使用快照隔离(我的粗体)

在数据库中启用快照隔离时,READ_COMMITTED_SNAPSHOT数据库选项确定默认的READ COMMITTED隔离级别的行为。如果未明确指定READ_COMMITTED_SNAPSHOT ON,则READ COMMITTED应用于所有隐式事务。这产生与设置READ_COMMITTED_SNAPSHOT OFF(默认值)相同的行为。当READ_COMMITTED_SNAPSHOT OFF有效时,数据库引擎将使用共享锁来强制执行默认隔离级别。如果将READ_COMMITTED_SNAPSHOT数据库选项设置为ON,则数据库引擎将使用行版本控制和快照隔离作为默认设置,而不是使用锁来保护数据。

所以,是的。

启用RCSI将允许读取获得一致的数据,并且不会被写入器阻止,而将继续使用“读取已提交”


4

我建议您阅读以下问题及其答案:数据库锁定问题?

找到正确的隔离级别以用于数据库级别是您现在可以做的最快的事情,可以帮助您解决此问题,因为现在很难更改所有与数据库相关的应用程序并更改其代码。因为您说过“我对调用select语句的过程没有任何控制”,所以最快的答案是将数据库切换到“读取提交的快照”隔离级别,因此您不会碰到读取查询。否则,您需要对在大事务中读取数据的会话使用快照隔离级别。

有关选择正确的方法的更多详细信息:选择基于行版本控制的隔离级别

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.