在SQL Server中的事务隔离级别REPEATABLE READ

4

使用SET TRANSACTION ISOLATION LEVEL REPEATABLE READ会有什么风险或性能下降?

我们有一些存储过程被BizTalk服务调用。有时会出现死锁。如果我们更改隔离级别,可能会面临哪些风险和可能的性能下降?


“死锁”是什么意思?是指“SQL Server”返回一个错误消息,说已经解决了死锁,还是你的事务只是挂起了?后者不是死锁,而是锁争用。 - Quassnoi
4个回答

4
Repeatable Read会对所有已经获取的行进行锁定。在使用游标获取大量数据的情况下,这可能会与其他用户竞争资源,因为他们无法获取锁来更新游标读取的任何行,直到游标关闭。
性能降级的风险是事务可能遇到更多超时和/或死锁。这种风险与两个事务同时需要读取/更新相同行的概率成正比。还有一个影响应用程序的因素是锁定所占的大小。如果锁被以页面为单位锁定,则如果不同的事务需要访问位于同一页上的数据,就可能发生争用,而不一定是同一行。
另一方面,当您使用较低的隔离级别(例如游标稳定性)时,您将保留在事务期间之前已经获取的行可能被其他事务更新的可能性,直到您的工作单元完成。

2

试一下。我们无法告诉您单个数据点(事务隔离级别)可能会遇到什么潜在风险或性能问题。我们对您的数据、数据量、TPS、数据依赖等一无所知。每当涉及性能问题时,请尝试并测量它。没有其他答案。


2

补充前面的话:你无法完全消除死锁。你能做的只是将它们发生的可能性降到最低。


1

可重复读取在读取后不会解除共享锁定。

这意味着,如果您在 RR 事务中执行了 SELECT,并发事务将无法更新被您的 SELECT 锁定的行。


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