如何在SQL Azure中识别死锁?

12

我有一个Windows Azure角色,由两个实例组成。偶尔会发生交易失败的情况,出现以下文本的SqlException

Transaction (Process ID N) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

现在我已经谷歌搜索了一段时间,并阅读了这篇文章,介绍如何使用SQL Server日志识别死锁。

问题是...

在SQL Azure中该如何做呢?我需要使用哪些工具来访问SQL Azure的内部并获取足够的数据呢?


如果您在这里找不到令人满意的答案,请毫不犹豫地直接联系Microsoft。自Guthrie先生接手以来,微软已经向Azure投入了大量资源,并为Azure开发人员提供了令人印象深刻的支持。如果这仍然无法解决问题,我将继续关注此线程,并引导我认识的Azure MVPs回答此线程,因为我也想知道这个答案。 - JSWork
3个回答

5
在 SQL Azure 数据库的“Master”数据库上运行以下查询:
select * from sys.event_log where event_type='deadlock' and database_name='<Databasename>';

这个查询存在性能问题,如果超时,请尝试以下操作:


SELECT *
,CAST(event_data AS XML).value('(/event/@timestamp)[1]', 'datetime2') AS TIMESTAMP
, CAST(event_data AS XML).value('(/event/data[@name="error"]/value)[1]', 'INT') AS error
,CAST(event_data AS XML).value('(/event/data[@name="state"]/value)[1]', 'INT') AS STATE
,CAST(event_data AS XML).value('(/event/data[@name="is_success"]/value)[1]', 'bit') AS is_success
,CAST(event_data AS XML).value('(/event/data[@name="database_name"]/value)[1]', 'sysname') AS database_name
FROM sys.fn_xe_telemetry_blob_target_read_file('dl', NULL, NULL, NULL)
WHERE object_name = 'database_xml_deadlock_report'

第二个查询的数据以XML格式呈现,与正在执行的过程相关。祝好运!


1
我认为这两个查询在v12中都不起作用。对我来说,来自sys.event_log的第一个查询返回行,但没有XML。在同一数据库上,第二个查询不返回任何行。 - yowl00
尝试了上述两个查询,但都没有返回死锁 XML。 第一个查询无法完成,第二个查询可以运行,但事件 additional_data 列为 NULL。Azure SQL 数据库版本为Microsoft SQL Azure (RTM) - 12.0.2000.8 Oct 1 2020 18:48:35 Copyright (C) 2019 Microsoft Corporation - Stephen Morris - Mo64

5

2
现在 Azure SQL 数据库支持两种方法来获取死锁 xml 报告。您可以创建一个 db-scoped XE 会话,并使用 database_xml_deadlock_report 事件自己跟踪它们,或者您可以修改之前答案中的 sys.fn_xe_telemetry_blob_target_read_file 调用,将 'el' 替换为 'dl'。现在,死锁将被路由到它们自己的文件中,而不是与登录事件混在一起。
MSDN 文章 包含最新信息。

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