【发布时间】:2016-02-11 05:56:14
【问题描述】:
我有一个表,其中值可以被不同的用户和 100k 行的记录更改。
我创建了一个存储过程,其中有一个 begin tran 和最后一部分 根据情况提交或回滚更改。
所以现在我们遇到的问题是该表的锁。例如,第一个用户正在通过系统执行存储过程,那么其他用户将无法选择或执行存储过程,因为该表当前已锁定。
那么,除了使用脏读之外,还有什么地方可以避免锁定。或者我可以在不使用 begin tran 的情况下回滚所做的更改,因为这是表被锁定的主要原因。
【问题讨论】:
-
向我们展示 SP。死锁的一个原因是由次优 SP 引起的长时间运行的事务。
-
这么长,整个过程都是2个sp完成的。但我们已经优化了代码以使其更快。
-
SQL Server 通常不会锁定整个表 - 它首先锁定在行级别。只有当您的事务尝试应用超过 5000 次更新(或删除或插入)时,SQL Server 才会升级为表锁......
-
通常我们会同时更新每个用户 1000 行。
-
在很多情况下,您可以通过重新排序 DML 操作(如果可能)来解决死锁。例如,如果在进程 1 中更新 T1 然后 T2,而在其他进程中更新 T2 然后 T1,则会增加死锁的可能性。在这种情况下,如果您可以在两个过程中更新 T1 和 T2,您将解决死锁问题。
标签: sql-server sql-server-2008