3

我知道这里有人问过这个问题,但 1)它相对较旧,2)它对我没有多大帮助。

在我的数据库上进行一些操作时,我遇到了相对大量的死锁。设置如下:

表:

将外键放入表 B 中的表 A。

操作:

插入表 A

插入表 B

更新表 B 中的行

删除表 B 中的行

删除表 A 中的行

问题:

这些操作基本上可以按任何顺序发生,因为我有多个工作角色,因此这些操作必须是幂等的,但是,每个工作角色将使用表 A 中的不同主键。我仍在尝试围绕锁定表,据我了解,A 上的任何删除都将首先锁定表 B,在那里删除相关行,然后从 A 中删除该行。我目前认为这是一个原子操作,没有时间在两者之间执行额外的锁锁定表 B 和锁定表 A,因为我无法想象一种解决方法。

我目前能够在以下格式的 Microsoft Visual Studio 中捕获异常:

事务(进程 ID xxx)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。

此异常似乎可能发生在上述任何操作中。

我的问题是:我怎么知道哪些锁/事务是导致死锁的?有谁知道在我们得到异常后任何有用的查询?

4

4 回答 4

5

sys.event_log是这里的答案。

它位于您服务器的主数据库中,并且应该包含一个条目,其中包含您的数据库在上个月遇到的所有死锁图。

有了死锁图,有很多关于 sql server死锁图调试的教程。

于 2013-03-22T02:16:01.270 回答
0

目前几乎不存在用于 Sql Azure 的分析工具。

标准 Sql Server 和 Sql Azure 世界之间的锁定问题应该没有太大区别,因此我建议尝试使用标准技术在“旧”世界中重现该问题,例如良好的旧 Profiler:非常有用的文章这个

如果这种方法没有被证明是富有成效的,那么一个肮脏的解决方案可能是处理 catch/retry logic

于 2013-03-19T16:57:28.187 回答
0

我最近遇到了类似的问题。尝试将您的更新与“with (UPDLOCK)”一起使用。

于 2013-03-19T17:59:54.077 回答
-1

尝试找出根本原因:

  • 首先只运行一个工作者角色。

然后检查:

  • 您是否锁定在正确的级别表锁、页锁或行锁?
  • 你要释放锁吗?
  • 您的系统是否以这样的方式设计,对同一行的所有编辑都将由同一台机器完成?

这里有一篇关于查找阻塞查询的博客文章:http: //blogs.msdn.com/b/sqlazure/archive/2010/08/13/10049896.aspx

于 2013-03-19T15:53:22.090 回答