问题标签 [database-deadlocks]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
6473 浏览

sql-server - 我有关于死锁的数据,但我不明白它们为什么会发生

我在我的大型 Web 应用程序中收到很多死锁。

如何自动重新运行死锁事务?(ASP.NET MVC/SQL 服务器)

在这里,我想重新运行死锁的事务,但有人告诉我要摆脱死锁——这比试图抓住死锁要好得多。

所以我花了一整天的时间在 SQL Profiler 上,设置跟踪键等。这就是我得到的。

有一张Users桌子。我有一个非常高的可用页面,其中包含以下查询(它不是唯一的查询,但它是导致麻烦的那个)

然后在所有页面中都有以下查询:

这就是我从 cookie 中获取用户的地方。

经常会发生死锁,并且第二个 Linq-to-SQL 查询被选为受害者,因此它没有运行,并且我的站点的用户会看到错误屏幕。

这是来自 SQL Profiler 捕获的 .XDL 图的信息(这只是第一个死锁,不是唯一的死锁。整个列表是巨大的。):

我读了很多关于死锁的文章......而且我不明白为什么这会导致死锁。

所以很明显这两个查询都经常运行。至少每秒一次。可能更频繁(300-400 个在线用户)。所以它们可以很容易地同时运行,但是为什么会导致死锁呢?请帮忙。

谢谢

0 投票
4 回答
981 浏览

sql-server-2005 - SQL Server 2005 中的死锁!两个实时批量更新正在战斗。为什么?

替代文字

这是场景:

我有一个名为 MarketDataCurrent (MDC) 的表,它可以实时更新股票价格。

我有一个名为“LiveFeed”的进程,它从网络中读取价格流,对插入进行排队,并使用“批量上传到临时表然后插入/更新到 MDC 表”。(批量更新)

我有另一个进程读取这些数据,计算其他数据,然后使用类似的 BulkUpsert 存储过程将结果保存回同一个表中。

第三,有大量用户运行 C# Gui 轮询 MDC 表并从中读取更新。

现在,在数据快速变化的那一天,事情运行得相当顺利,但是,在市场交易时间之后,我们最近开始看到数据库中出现越来越多的死锁异常,现在我们每天看到 10-20 个. 这里要注意的重要一点是,这些发生在值不变的情况下。

以下是所有相关信息:

表定义:

-

替代文字

我有一个正在运行的 Sql Profiler Trace,正在捕获死锁,这就是所有图表的样子。

替代文字

进程 258 被称为以下“BulkUpsert”存储过程,重复,而 73 正在调用下一个:

还有一个:

澄清一下,这些临时表是由同一连接上的 C# 代码创建的,并使用 C# SqlBulkCopy 类填充。

对我来说,它看起来像是在桌子的 PK 上死锁,所以我尝试删除那个 PK 并改用唯一约束,但这使死锁的数量增加了 10 倍。

我完全不知道如何处理这种情况,并且对任何建议都持开放态度。

帮助!!


响应对 XDL 的请求,这里是:

0 投票
1 回答
669 浏览

php - 是否可以选择...进行更新,进行电子商务交易,然后在 PHP 中调用 MySQL 存储过程?

我目前正在为我的客户构建一个 PHP 电子商务网站。它进展顺利,但我遇到了障碍,想知道是否有任何 MySQL/PHP 专家可以帮助我。基本上,电子商务网站只销售一次产品(意味着每件商品只有一个数量的库存),这意味着一旦客户签出该商品,就无法再购买。

所以在结帐时,我必须检查产品是否仍有库存。假设这将是一个流量很大的网站,可能会有两个或多个客户同时尝试结账的情况,因此他们都可以购买产品。所以为了防止这种情况,我的计划如下:

  1. 在产品上选择...FOR UPDATE,以锁定表行。
  2. 进行电子商务交易(Paypal、authorize.net 等)
  3. 电商交易成功,调用MySQL存储过程(也有SQL交易)来存储订单信息等,失败则回滚

这个计划有可能实现吗?要执行 SELECT...FOR UPDATE,我必须启动一个 SQL 事务,但随后我还要在 MySQL 存储过程的第 3 步中启动另一个事务。我不确定会发生什么。另外,这个计划会导致僵局吗?

抱歉,问题很长,但感谢您的帮助!

0 投票
2 回答
4875 浏览

postgresql - Postgresql:从外键约束评估中获取隐式锁

所以,我对 Postgresql 中的外键约束处理感到困惑。(版本 8.4.4,值得)。

我们有几张表,在下面稍微匿名:

所以我开始使用两个数据库窗口来运行一些查询。

db2 连接块。

在我看来,device_stuff 上“左”列的更新应该受到设备表上的活动的影响,这似乎很奇怪。但它是。事实上,如果我回到 db1:

pgsql 日志有以下内容:

我想我有两个问题:第一个是我不了解发生这种锁定的确切机制。update device_foo我有几个有用的查询来查询 pg_locks 以查看语句调用的锁类型,但是当我单独运行命令时,我无法观察到这种特定类型的锁。(不过,也许我做错了什么。)我也找不到任何关于外键约束检查的锁定获取行为的文档。我只有一条日志消息。我是否可以从中推断出对行的任何更改都将在它所针对的所有表上获得更新锁?

第二个问题是我想找到一些方法让它不会像那样发生。我在实际应用程序中偶尔会出现死锁。我希望能够运行影响所有行的大更新语句,device_foo而无需在设备表上获得大锁。(表中有很多访问权限device,而且这是一种昂贵的锁。)

0 投票
2 回答
2160 浏览

sql-server - 在 SQL XDL 文件中,如何读取死锁的进程节点上的 waitresource 属性?

在 SQL Server 2005 上,

更新同一张表中的两个不同键时,我遇到了死锁。

请注意,这两个等待资源具有相同的开始部分,但结束部分不同。

这两个钥匙被锁住了,我需要弄清楚为什么。

question:_

如果括号中的值不同,为什么键的前半部分相同?

0 投票
1 回答
494 浏览

sql - SQL Server 跟踪 - 将 PAGE 信息转换为实际资源

我正在研究我们的应用程序中发生的死锁。我为 1204、1205 和 3605 打开了跟踪。我得到了死锁跟踪。但我无法弄清楚它陷入僵局的资源。我读过很多论坛,他们都说跟踪应该包含一个叫做 KEY/RID 的东西,它会指向有问题的资源。但我的跟踪文件根本不包含 KEY/RID。相反,它包含称为 PAGE 的内容。

例如,06/30/2010 16:29:52,spid4s,Unknown,PAGE: 8:1:16512 CleanCnt:2 Mode:IX Flags: 0x2 06/30/2010 16:29:52,spid4s,Unknown,PAGE : 8:1:5293 CleanCnt:2 模式:IX 标志:0x2

根据我得到的这个 PAGE 信息,我如何确定这个资源是什么?在此先感谢您的帮助!

0 投票
3 回答
261 浏览

concurrency - 检测到死锁时应该发生什么

假设我想实现一个带有锁系统的数据库,并且我使用锁避免并在获取它之前尝试避免潜在的死锁。

我的问题是:

当会话/事务已经成功地获取了某个资源 A,现在它尝试获取资源 B 上的锁时,检测到死锁。

因此,会话在获取 B 上的锁定时失败,系统是否应该强制会话放弃会话所持有的其他资源,在这种情况下:A,并使会话无效?

还是有其他更标准的方法来处理这种情况?

0 投票
4 回答
12761 浏览

sql - 在 Sql Server 2005 中使用 UPDATE 语句避免死锁的最佳隔离级别

我需要在 sql server 表上执行更新语句。该表同时被另一个进程使用。因为有时会发生死锁,您建议使用哪种隔离级别来避免或尽量减少这些死锁?

0 投票
3 回答
1149 浏览

sql - SQL死锁问题

这两条语句在关系数据库中是否可能死锁?我试图简化我的问题和示例——请假设这些选择,我认为通常只需要共享读锁定,现在需要独占读锁:

也就是说,连接的顺序是否重要?SQL中的单个语句是原子的吗?是否在第一个语句中先锁定 A 然后 B 并且在第二个语句中先锁定 B 然后再锁定 A?

我认为不会——我的直觉告诉我,无论多么复杂,像这样的两个单一语句都不会死锁。我相信一个语句是作为一个整体进行分析的,并且需要锁定的资源是使用某种确定性的全局顺序(即按字母顺序)锁定的。但我需要的不仅仅是直觉——我想不出一种方法来证明它,我也找不到它的记录。

我对 MS SQL 2005 感兴趣,但我认为问题不是特定于实现的。

其次:由于它与 MS SQL 相关,我还想知道 Common Table Expressions 也有这个保证——CTE 主要是一种语法优势(+递归),由引擎合并到一个传统的单个语句中。

0 投票
2 回答
206 浏览

sql-server-2008 - SQL Server 死锁 (SQL Server 2000)

我有一位客户每天遇到 5 次以上的死锁。170 多个其他客户根本没有遇到任何死锁。我已经实现了死锁跟踪,并且可以看到选择/更新/插入死锁正在发生。我实现了一个 with (rowlock) 提示,这解决了最初的死锁。然而,事情仍然会进一步陷入僵局。

我发现客户正在运行自定义 SQL,这导致了一些问题,但不是全部。

我的问题真的是有谁知道将客户从 sql server 2000 升级到 sql server 2008 是否会解决这个问题?

谢谢,

上校。