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

mysql - 有没有办法不锁定MySQL?

我有一个每天运行一次的查询,它从我的数据库中获取某些表并将它们放入一个表中,这样我就可以以我需要的任何格式快速导出信息。

我遇到了一个问题,但是它给了我以下错误:“SQLSTATE [40001]:序列化失败:尝试获取锁定时发现 1213 死锁;尝试重新启动事务”

据我了解,这听起来像是我的查询在已经有锁的情况下试图在表上获得锁。但是我承认我对表锁定或其工作原理一无所知。

真的,我只是想读取其他表而不是写入它们,有没有一种方法可以创建查询但不请求锁定?

我的查询太长了,所以我没有发布它。如果您需要某些部分,请告诉我,我可以发布它们。

0 投票
2 回答
856 浏览

mysql - 在 MySQL (InnoDB) 中发现死锁

在我的数据库中运行某个查询时,我经常收到以下错误(所有表都使用 InnoDB 存储引擎):“尝试获取锁定时发现死锁;尝试重新启动事务”

查询是DELETE FROM sessions WHERE userid != 0 AND lastactivity < 1289594761 AND admin = 1 AND userid NOT IN (SELECT userid FROM users WHERE (userflags & 1048576))

当我将 NOT IN 部分添加到 WHERE 语句中时,错误开始发生。为什么这会引起问题,我能做些什么来防止这种情况发生?

0 投票
3 回答
33597 浏览

c# - SqlException:死锁

当我尝试从 C# 中的 SQL 数据库中获取数据时,产生了这两个异常:

System.Data.SqlClient.SqlException:事务(进程 ID 97)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。

或者

System.Data.SqlClient.SqlException:事务(进程 ID 62)在锁定资源上与另一个进程死锁,并已被选为死锁牺牲品。

或者

System.Data.SqlClient.SqlException:事务(进程 ID 54)与另一个进程在锁资源上死锁,并已被选为死锁受害者。重新运行事务。

这是代码:

这些每次都发生。

关于如何解决这些问题的任何想法?

0 投票
2 回答
9086 浏览

sql-server-2005 - SQL server 更新语句导致死锁

我有一个应用程序在不同的线程中同时运行多个 sql 语句,导致各种死锁似乎都来自一个表。例如下面的两个更新语句:

UPDATE WF SET QUEUETIME='2011-02-18 13:06:53.578', STATE = 'outbound', USER = '', TIME = null WHERE PID = 'MessageProcessing' AND ACTIVITYID = 'Delete' AND ITEMID = '120' AND TRANID = '创建' AND STATE = '就绪' AND USER = ''

更新 WF SET QUEUETIME='2011-02-18 13:06:53.625', STATE = 'ready', USER = '', TIME = null WHERE PID = 'standardOutbound' AND ACTIVITYID = 'Node1' AND ITEMID = '121' AND TRANID = 'toNode1' AND STATE = '' AND USER = ''

产生以下死锁:

我意识到一些死锁是不可避免的,应用程序应该处理它们(它确实如此),但我不明白为什么它们应该在这种情况下发生。在我的简单想法中,这两个语句应该锁定不同的行,即使它们更新同一行,一个也应该等待另一个。

谁能解释他们为什么会导致死锁,或者就如何防止死锁提供任何建议?

我们在表上有 3 个非聚集索引(PID、ACTIVITYID、ITEMID、TRANID)、(ITEMID)和(PID、ACTIVITYID)。(PID, ACTIVITYID, ITEMID, TRANID) 构成主键。我试过(有点盲目地)玩弄索引,但似乎无济于事。

该应用程序在 weblogic 和 sql server 2005 上运行,我已经重现了 websphere 和 sql server 2008 上的死锁。使用 oracle 数据库时似乎不会发生这种情况,但不幸的是,这不是我们客户的选择!

非常感谢任何可以提供帮助或对此有所了解的人。

0 投票
2 回答
1030 浏览

sql-server - Sql Sever 2008 在同一索引上选择和删除死锁

我遇到了不清楚的 sql server 2008 死锁。

我有两张桌子:

sql server 错误日志描述如下:

PK_X 是标识列(ID 是自动递增列)上的聚集升序索引。T2 还有另一个索引,它是 JOBID 和 X 上的非聚集索引。

为什么两个进程都是同一对象(T2.PK_T2)上的锁的所有者?

请帮忙,多伦

0 投票
1 回答
1584 浏览

php - 我的 MySQL 死锁场景 - 需要建议

我需要这方面的专家建议。

后台 PHP/Codeigniter MYSQLi Innodb 表 - fares_table 存储过程

后端 - 每隔几分钟编写一个 cronjob php 脚本以将数据(来自服务)插入/更新到 fares_table 中。(普通sql查询)

前端 - 用户将能够读取这些数据(查询以存储过程形式编写,因为它涉及连接许多表,因此我的存储过程已从 fares_table 的 select 语句创建临时表并连接到其他表)

问题

如果用户碰巧在 fares_table 更新/插入时偶然发现前端,则可能会发生死锁。更新语句发生死锁

死锁是由于存储过程试图等待锁定释放,同时尝试使用来自 fares_table 的 select 语句创建临时表,而后端执行插入或更新尝试等待锁定释放。

我的临时修复

捕获数据库错误 1213 并重试更新查询。它现在可以工作,但我想找到一个更好的解决方案来防止死锁。有什么专业建议吗?

我如何更改顺序以防止死锁或重复索引的flighttype_idx帮助?

0 投票
3 回答
2758 浏览

sap-ase - Sybase 中可用的默认锁数是多少

Sybase 抛出以下错误“发生死锁或所有锁已被占用”。所以我想检查问题是否是因为 Sybase 用尽了可用的锁。

有谁知道可用的默认锁,以及如何找到可用的锁数

0 投票
1 回答
17033 浏览

sql-server - 如何从 MS SQL 2008 中的数据库 ID、文件 ID、页面 ID 获取表名?

我有死锁图,其中锁定资源由这三个字段 DB ID、文件 ID、页面 ID 提及。还有一些相关的objectid。我只想知道这个页面属于哪个表。我试过DBCC PAGE(dbid, fileid, pageid) with tableresults了,但没有显示任何表名。

知道如何得到这个吗?

更新:也试过SELECT name From sys.indexes WHERE object_id = 123 and Index_id = 456 这里 123 是m_objid(next ObjectId) 和 456 是m_indexid(next IndexId),我得到了DBCC Page命令的输出。我得到的只是NULL。

0 投票
1 回答
509 浏览

mysql - 为什么 InnoDB CREATE ... SELECT 使用排他锁?

我试图绕过偶尔出现的 InnoDB 死锁:

我当时不知道,但似乎 INSERT ... SELECT, CREATE ... SELECT 锁定了 SELECT 查询中的所有表。如您所见,有很多带有连接和子查询的表。我以为锁是共享(S)锁,但从上面的数据来看,它似乎持有排他(X)锁;我不明白为什么。

也许如果有人能帮我弄清楚为什么 CREATE ... SELECT 查询上有一个排他(X)锁,我可以尝试解决这个死锁。或者,也许我可以在僵局中得到一些进一步的帮助。

谢谢你。

0 投票
2 回答
970 浏览

sql - 死锁谜题:受害者不拥有任何资源,用于杀死解决死锁

我有一个奇怪的死锁图,其中 MSSQL server 2008 选择的受害者不是死锁循环的一部分。这个死锁在select和之间insert。死锁资源是所有select需要的单个表waitresource = "KEY: 6:72057594098810880 (ffffffffffff)"

问题1:这里的 ffffffffffff 是否意味着他们想要在整个桌子上进行全范围锁定?还是整个键范围?或者是其他东西?

我们遵循一个规则,即表永远不会有主键 id = 0 的行。我们做这种检查的地方很少

select foo from bar where @someId = 0 OR SomeId = @someId.

我还了解到 SQL 不会使表达式短路。因此,如果我通过@someId = 0并不能保证其他部分不会被评估。所以 SQL 有可能在运行时执行SomeId = @someId

问题2:由于无法在 SomeId 中找到 0,SQL 将在整个表(或行)上获取范围锁,因此没有其他人插入 0 id。正确的?

考虑到这个假设,我将 where 子句更改为此

希望这将强制评估顺序。但我错了。我又陷入僵局了。我在下面附上了死锁图。我已重命名所涉及的表和存储过程(公司政策)

问题3:你知道我在这里想念什么吗?

在此处输入图像描述