我看到了一些与死锁有关的超时错误,特别是:
Transaction (Process ID 161) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
这是断断续续的,虽然我知道是什么导致了这个问题,我想在投入太多的时间和精力之前进行调查和验证。
是否有方法查看围绕这些类型错误的日志,以查看事务正在运行哪些查询,以及/或当时锁定了哪些表?
由于是间歇性的,我很
每隔一段时间我就会收到一个mysql错误。错误是
Deadlock found when trying to get lock; try restarting transaction
查询为
var res = cn.Execute("insert ignore into
Post(desc, item_id, user, flags)
select @desc, @itemid, @userid, 0",
new { desc, itemid, userid });
这个问题究竟是如何导致它的呢?在谷歌搜索时,我看到了一些关于查询如何占用很长的锁行
我正在使用node-mysql2,它有一个连接池,连接限制为10。当我重新启动应用程序时,结果很好-它们与我在数据库上的结果相匹配。但是,当我开始插入新记录并重做相同的select查询时,我得到的结果断断续续,遗漏了我刚刚添加的最新记录。
如果我直接检查数据库,我可以看到我刚刚通过我的应用程序添加的记录。只是应用程序不能以某种方式看到它。
我认为这是一个bug,但下面是我如何设置代码的:
module.exports.getDB = function (dbName) {
if (!(dbName in dbs)) {
console.log(`Initiating $
在我的客户端应用程序中,我有一个类似这样的方法(实际上它更复杂,但我留下了主要部分):
public void btnUpdate_Click(...)
{
...
dataAdapter.Update(...);
...
dataAdapter.Fill(...); // here I got exception one time
}
我在日志中发现的异常是“尝试获取锁时发现死锁;尝试重新启动事务”。我只遇到过一次这个异常,所以它没有重复。
据我所知,DataAdapter.Fill()方法只执行select查询。我不进行显式事务,并且启用了自动提交。
那么,我如何才能在一个
我有一些带有死锁的MySQL (innodb),我只是想杀死这些事务,然后继续前进。
“显示引擎INNODB状态”显示如下:
*** (1) TRANSACTION:
TRANSACTION 74D88AFE, ACTIVE 14 sec starting index read
mysql tables in use 3, locked 3
LOCK WAIT 3 lock struct(s), heap size 1248, 2 row lock(s)
MySQL thread id 4637121, OS thread handle 0x7f51f91be700, query id 979
我不明白两个重复查询,每个查询使用主键删除单个表上的一行,怎么会死锁。有谁能解释一下吗?
在我看来,其中一个事务应该获得锁,而另一个事务则必须等待。
以下是死锁报告,以及查询:
Fri Jun 01 2012 13:50:23
*** (1) TRANSACTION:
TRANSACTION 3 1439005348, ACTIVE 0 sec, process no 22419, OS thread id 1166235968 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), hea
在查询包含UPDATE和JOIN的语句时,我们将得到以下错误:
Statements writing to a table with an auto-increment column after selecting
from another table are unsafe because the order in which rows are
retrieved determines what (if any) rows will be written.
This order cannot be predicted and may differ on master and the slave
我遇到的情况是,两个事务会造成mysql死锁。
引发以下错误:Deadlock found when trying to get lock; try restarting transaction
如果我是正确的,这个错误意味着mysql死锁超时已经过期,mysql试图做些什么来消除这个死锁。
对我来说不清楚的是,try restarting transaction是什么意思?如何“重新启动”事务?
两个锁定的事务会发生什么?他们都被取消了吗(滚回)?或者只是其中一个被取消了锁才能被释放。
提前感谢
我检查了其他类似的问题,例如堆栈溢出中的“死锁在MySQL中”,但是没有任何问题导致解决方案。
REPLACE INTO db2.table2 (id, some_identifier_id, name, created_at, updated_at) (SELECT id, some_identifier_id, name, created_at, updated_at FROM db1.table1 WHERE some_identifier_id IS NOT NULL AND some_identifier_id NOT IN (SELECT some_identifier_id FR
我在我的InnoDB表上得到了一个Deadlock found when trying to get lock; try restarting transaction错误。下面是查询:
UPDATE views
SET visit_cnt = visit_cnt + 1
WHERE visit_day = DATE(NOW())
AND article_id = '4838'
此查询还通过ON UPDATE trigger触发:
UPDATE articles
SET views = views + 1
WHERE id = NEW.article.id
以下是我尝试
我有一个mysql DELETE查询,其中where子句使用带有IN的主键:
delete from my_table where id in (4, 900, 700);
我收到了死锁错误。我不明白为什么会这样,也不知道如何避免。虽然其他查询正在从同一个表中选择/删除/添加,但没有为这些ID选择任何其他查询。PK id是特定于单个用户的,因此没有其他人使用这些相同的id。我认为使用主键可以防止delete语句锁定其他行。
编辑:引擎为innoDB
我有一个应用程序与数据库有一些问题:当它试图打开到数据库的连接时突然冻结(或者执行查询,这是不清楚的)。没有错误消息。我怀疑有一些查询阻塞了其他人,我正在试图弄清楚这是什么。我用过
SET profiling=1;
但当我执行:
show profiles;
我只得到我自己执行的查询,而不是应用程序查询(应用程序和我使用的是同一个用户)。
呼叫
SHOW FULL PROCESSLIST;
返回一个具有所有进程的表。
+-----+----------+---------------------+--------+---------+------+-------+--------------
有时,对于只是一个选择查询的存储过程,我会遇到以下错误:Transaction (Process ID 91) was deadlocked on lock
我最初的理解是,select查询不会锁定一个表,或者即使它试图查询的表正在被另一个进程更新/锁定,也不会导致死锁,但看起来select查询也可能导致死锁。
如果我将查询的隔离级别设置为read uncommitted,会解决问题吗?