问题标签 [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 投票
1 回答
1799 浏览

mysql - 多线程海量删除查询和批量插入批量的 SQL 死锁

我在 .NET 中有一批读取大量文件并将其内容存储到具有以下结构的单个 MySQL InnoDB 表中:

在哪里

  • idItem 是外键
  • Source、Period 和 idItem 是索引
  • 组合是唯一的索引。

为了执行表更新,我有一个包含两个步骤的事务:

  1. 在我的新数据集的时间间隔内删除所有具有 StartDate 的旧行。
  2. 使用单个 INSERT 语句插入新行(最多 10,000 行)。

    开始交易;

    从数据中删除 Source = @Source AND Period = @Period AND idItem = @idItem AND St​​artDate >= @FirstDate AND St​​artDate <= @LastDate;

    插入数据(..,..,..,..) 值(..,..,..,..)(..,..,..,..)(..,.., ..,..)(..,..,..,..);

    犯罪;

问题是,当同时从多个线程运行时(1 个线程正常工作,2 个或更多线程中断),即使每个线程只能更新一组不同的(Source,Period,idItem)(没有重叠),我得到一个 1213 异常:尝试获取锁时发现死锁;尝试重新启动

此问题与此处描述的问题非常相似:SQL deadlock on delete then bulk insert

你会建议什么来防止这种僵局?我已经尝试了这里建议的所有内容,但没有令人信服的结果。谢谢!

附件:

0 投票
1 回答
603 浏览

mysql - 分区会防止数据库死锁,当它们是由否则会进入两个分区的行引起的?

我正在与甚至不应该出现的死锁作斗争,因为我正在对表的互斥子集运行批量删除和插入。然而,当在多个线程上运行查询(每个线程访问可能位于不同分区上的数据)时,死锁似乎是不可避免的。

有关该问题的更多详细信息,另请参阅此问题,但我想更笼统地说,是否建议使用分区来处理死锁。

0 投票
0 回答
628 浏览

mysql - 已获取锁上的 MySql 死锁

我遇到了一个令我困惑的僵局。我在另一篇文章中读到Mysql 死锁解释需要一个不能解决我困惑的答案。这种情况也出现在另一个关于SHOW INNODB STATUS的参考解释页面中。

我也在附加我的实例 - 这有点不同,因为它锁定了一个索引,一次有间隙,一次没有。

但我认为主要问题仍然是相同的:

如果 Transaction(2) 有 lock A,那么 Transaction(1) 正在等待 Lock A,难道 Transaction(2) 再次请求 lock A会死锁吗?

这听起来不对,尽管这是我们在 InnoDb 状态中看到的。当我尝试直接在 MySql 中重新创建时,对不同的事务使用不同的选项卡 - 一切正常,并且没有这样的死锁。我还附上了我徒劳的重建尝试。

我可能在对这种情况的解释中遗漏了一些东西,我将不胜感激。

我正在使用带有 Hibernate 3 的 MySql 5.1。

尝试重新创建(我删除了一些具有外键的列 - 因为它们在 InnoDb 状态中没有提到):

1) 初始设置:

2)事务2:开始事务(我使用gui)大概是获取事务2的第一把锁

3)事务1:开始事务大概是在等待锁——顺便说一句,事务确实在等待。

4)事务2:大概试图再次等待同一个锁 - 顺便说一句,这根本不等待。

现在我可以提交事务 2,然后是事务 1,一切正常……没有重现死锁情况……

0 投票
1 回答
588 浏览

visual-studio-2010 - Sql server 数据库事务死锁;视觉工作室插入程序

我有一个 sql server 数据库设置,它接受来自使用线程运行的 Visual Studio 应用程序的插入事务。现在事务陷入僵局,我有一个解决方法,当 Visual Studio 2010 代码检测到超时时,它只会重新尝试插入数据。查看我设置的文本日志,这种情况发生得太频繁并导致性能问题。一些在线资源表明找到了有问题的事务并将其杀死,但如果我的应用程序依赖于在数据库中获得的结果,那可能不是一个选项。有没有关于如何处理这个问题的建议。我在 Visual Studion 2010 中使用 Parallel Taskfactory,所以在任何给定时间至少有 1000 个线程在运行?

一些要查看的代码:我的插入代码

任何想法都非常感谢。

sql表架构

用于插入的存储过程,因此它执行大量插入并依赖主键约束进行重复检查

完成表创建

我尝试导出死锁图,但无法让它工作,所以这里有几行来自跟踪

0 投票
1 回答
822 浏览

sql - sql死锁和超时几乎不断

看起来今天将是另一个垃圾。我们最近用一个完整的怪物更新了我们的 sql 盒,带有大量的内核和内存,但是我们被旧的 DB 模式卡住了,它是 crapola 我们的旧 sql 盒有问题,但与我们在新的 sql 盒中所经历的完全不同,尽管在推出的那天,它运行得非常快,一周之内就一团糟……

我们几百人使用的 .net 应用程序在 SQL 框上产生了大量的死锁和超时。我们正在努力找出原因。我们已经 - 检查了所有索引,它们现在已经尽可能好,一些主要的表太宽了,触发器数量也很愚蠢,但我们现在对此无能为力。

对于多次尝试的相同用户来说,很多 pids 似乎是相同的.. 例如..

用户:user1 时间:09:21 错误消息:事务(进程 ID 76)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。

用户:user1 时间:09:22 错误消息:事务(进程 ID 76)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。

等等..当我们将数据库移动到新盒子时,它会从旧盒子备份并恢复到新盒子......

如果有人对我们可以做的事情有任何建议,我会买几品脱给他们

谢谢

纳特

0 投票
4 回答
2734 浏览

sql - 火鸟触发死锁

我对数据库的经验很少,并且遇到了触发器问题,导致 firebird 2.5 数据库中的死锁。

数据库中有两张表。当从 ITEMS 表中添加或删除项目时,触发器会更新 STATS.ITEMCOUNT 和 STATS.SIZE。总共有 4 个触发器,2 个递增和两个递减。

stats 表只有一行,用于跟踪数据库中的内容。我这样做是错误的吗?如果没有,是否有工作回合。

在启动应用程序的最初几分钟内会发生死锁。

UPDATE1:发布所有触发器。

UPDATE2:发布 ExecuteNonQuery 方法

UPDATE3:即使使用pilcrow建议的视图方法,死锁仍然会发生。事实上,我什至尝试使用再次死锁的存储过程。在事务中包装 select 语句也失败了,因为 Firebird Ado 提供程序不支持并行事务。

数据库

** 触发器 **

0 投票
2 回答
58 浏览

multithreading - 达到计算机限制?

我编写了一个简单的应用程序,它构建了一个包含 999 个项目的并发字典,然后使用该ThreadPool.SetMinThreads()方法触发了 50 个线程。然后,我遍历 999 个字典条目并更新数据库中的一条记录,以标记一个条目已被处理。

运行应用程序时,我可以看到线程已经启动,然后我可以运行 SQL 查询来查看正在更新的记录。到目前为止,所有这些都运作良好。当一些初始线程完成后,下一批线程开始(这正是我想要它做的)。我仍然可以看到我在数据库中的记录仍在更新,告诉我应用程序正在按预期工作。我仍然可以看到正在创建的新线程,然后出现死锁。当我查看死锁时,它来自最初的 50 个线程之一。这就是我的问题所在。

我在具有 6Gb RAM 的 3Ghz 双核处理器上运行该应用程序。我的 SQL Server 实例也在同一台机器上运行,但我没想到这会是个问题。该应用程序是一个概念证明,但不能在开发环境中运行 50 个线程看起来并不乐观。我知道在生产环境中,SQL 实例将在单独的机器上,应用程序也是如此。有任何想法吗?

0 投票
1 回答
6016 浏览

oracle - Oracle 死锁的历史?

oracle 是否保留有关死锁的历史记录?

eg 我能知道当检测到死锁时执行了哪些sql,并且抛出了oracle 异常ORA-00060(在等待资源时检测到死锁)?

提前致谢。

0 投票
2 回答
490 浏览

sql-server-2008 - 为什么我有这个 SQL Server 死锁?包括 T1222 死锁痕迹

我遇到了僵局,但我不明白为什么。消息末尾是 T1222 跟踪。这是正在发生的事情:

有时当我们有几台计算机在做同样的事情时,我们会得到下面报告的死锁。我不明白的是,如果这只是一个读取查询,并且据我所知,没有人在该表上插入数据,那么我们如何在 SELECT TOP 1 @ENVIRONMENT = ENVIRONMENTDBOID 处出现死锁。

死锁报告:

0 投票
3 回答
13150 浏览

sql-server - 如何识别 SQL Azure 中的死锁?

我有一个由两个实例组成的 Windows Azure 角色。有时,事务将失败并SqlException显示以下文本

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

现在我在 Google 上搜索了一段时间,并阅读了这篇关于使用 SQL Server 日志识别死锁的文章。

问题是...

如何在 SQL Azure 中执行此操作?我使用什么工具来访问 SQL Azure 的内部并获取足够的数据?