【问题标题】:How to prevent deadlock of table in SQL Server如何防止 SQL Server 中的表死锁
【发布时间】: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


【解决方案1】:

是的,您至少可以(快速而肮脏)为事务启用SNAPSHOT 隔离级别。这将防止事务中的锁定。

ALTER DATABASE MyDatabase
SET ALLOW_SNAPSHOT_ISOLATION ON

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON

See了解详情。

【讨论】:

  • 安全。事务中的每个数据修改语句都会修改自当前事务启动以来被另一个事务更改的行,这将导致错误(乐观并发)。但是,在某些情况下,启用快照隔离会增加 I\O 负载和 tempdb 大小,因此会损害整体数据库性能。
猜你喜欢
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多