标签: deadlock

SQL 死锁统计工具

我公司的一个SQL数据库最近每天产生大量死锁(某天>100)

我正在尝试解决这些死锁的原因,我注意到许多死锁发生在同一个表中,我是数据库管理员的新手,所以我不知道对死锁报告进行统计的最佳方法是什么,就像我想计算和可视化事情,比如涉及哪些表,多少次,死锁通常发生的时间......所以我可以向我的老板报告,是否有一种简单的方法可以将所有死锁 xml 列导入到某些内容中像微软excel?

我在这里附上了死锁报告(.xel 文件)

死锁_报告

对不起,英语不是我的母语。

感谢您的时间,

sql-server deadlock excel

0
推荐指数
1
解决办法
323
查看次数

在后台作业中捕获死锁事件?

我目前正在使用分析器捕获死锁事件。(死锁,死锁图,死锁链)。

到目前为止一切顺利,但为此,客户端计算机需要不断运行和在线。

==> 有没有办法直接在 SQL Server 上捕获和收集死锁事件作为后台作业?

sql-server deadlock sql-server-2014

0
推荐指数
1
解决办法
71
查看次数

在 MSSQL 上造成人为的无限死锁?

有没有办法在 MSSQL 上造成人为的无限死锁?我需要引起死锁,以便我可以测试一些存储过程来自动消除死锁。有没有办法做到这一点?

sql-server deadlock

0
推荐指数
1
解决办法
306
查看次数

在以下库存系统中,是否可以强制行锁以避免死锁并确保其按预期工作?

我想为 M 个用户自动保留 N 个对象的库存。

我有两张库存跟踪表,一张用于全球库存,一张用于个人库存。

  • 全局清单表列:ObjectID uniqueidentifier、Count int
  • 个人库存表列:UserID nvarchar(64)、ObjectID uniqueidentifier、Count int

有两个表,因为我必须为每个对象以及每个用户强制执行最大允许保留。例如,一个对象可能被限制为总共保留 1000 个,每个用户最多保留 10 个该对象。

全局清单表以 [ObjectID] 为唯一键,个人清单表以 [UserID, ObjectID] 为唯一键。

  • 主键是每个表上的唯一索引,因此只对行进行锁定,而不会对其他索引键进行锁定。
  • 全局清单表将始终驻留在单个数据库中。
  • 个人库存表可以跨多个数据库进行分片,因此更新全局和一个或多个个人表的事务可能是分布式的。
  • 此“保留库存”事务是将在这些表上执行的唯一事务。

为 3 个对象保留库存的示例请求如下所示。一些对象有限制,而另一些则没有。

[
    {ObjectID: 'A', QuantityToReserve: 1},
    {ObjectID: 'C', QuantityToReserve: 2, GlobalMax: 1000, PersonalMax: 10},
    {ObjectID: 'B', QuantityToReserve: 5}
]
Run Code Online (Sandbox Code Playgroud)
  • 这种为多个对象保留库存的请求必须以原子方式完成,并且必须对所有对象都成功。
  • 在尝试在个人表上取任何锁之前,总是在全局表上取一组完整的锁。

原子预留是通过启动一个事务,然后首先更新全局清单表中的行来实现的,对于所有对象 ID,按升序排列。

没有限制的对象的更新语句如下所示:

UPDATE [GlobalInventory] WITH (ROWLOCK, XLOCK, HOLDLOCK)
SET [Count] = [Count] + @QuantityToReserve
WHERE [ObjectID] = @ObjectID
Run Code Online (Sandbox Code Playgroud)

具有限制的对象的更新语句如下所示:

UPDATE [GlobalInventory] WITH (ROWLOCK, XLOCK, HOLDLOCK)
SET …
Run Code Online (Sandbox Code Playgroud)

sql-server deadlock concurrency locking sql-server-2019

-4
推荐指数
2
解决办法
285
查看次数