【问题标题】:DeadLock on Azure SQL Database without transactions没有事务的 Azure SQL 数据库死锁
【发布时间】:2015-10-15 18:37:46
【问题描述】:

看起来尽管我们根本没有使用事务,但我们从 SQL Azure 中得到了随机死锁错误。

SQL Azure 会陷入死锁的情况是否不存在跨国情况?

当我们运行一批 UPDATE 查询时,它看起来就像是一个大事务。

所有更新都是通过 id 更新一行。

【问题讨论】:

  • 我不认为不使用事务会降低死锁的风险。我认为你应该提供更多细节。
  • 非事务并行查询怎么会陷入死锁?

标签: sql-server azure azure-sql-database deadlock database-deadlocks


【解决方案1】:

没有“不使用事务”之类的东西。总有一笔交易,无论您是否明确开始交易。阅读Tracking down Deadlocks in SQL Database,了解如何在 SQL Azure 中获取死锁图。连接到master 并运行:

SELECT * FROM sys.event_log
WHERE database_name like '<your db name>'
AND event_type = 'deadlock';

然后分析死锁图做了解原因。由于缺少索引,您很可能正在执行扫描。

【讨论】:

  • 您还可以在答案中包含锁。这实际上是导致死锁的原因。表格提示(使用 NOLOCK)可以解决大多数问题(并且未提交阅读)。 msdn.microsoft.com/en-us/library/ms187373.aspx
  • @RicardoC 不,脏读绝对不是答案。 Dirty reads return incorrect data.
  • @RicardoC 如果您想在不了解原因的情况下消除死锁,请使用快照隔离。例如。阅读Deadlocked!
  • 脏读消除了锁定问题。至于“绝对”……任何事情……没有解决方案是绝对正确或错误的。因为......好吧,您或我也了解他的需求,原因或他对此事的申请,因为 OP 的模棱两可和他对交易缺乏了解。是的,我知道脏读的后果,以及它是多么无关紧要(不是绝对意义上的)。
  • 我的印象是 SQL Server 默认使用 READ COMMITTED 隔离级别用于非跨国 SELECT 查询。
【解决方案2】:

当您运行并发事务(隐式或显式)时,您会遇到死锁。可能当您说没有交易时,这意味着您的交易是隐式的。

【讨论】:

  • 批量单个UPDATE by ID怎么会导致死锁? SQL Azure 是否将一批更新作为隐式事务运行?
猜你喜欢
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 2020-07-08
相关资源
最近更新 更多