我遇到的情况是,两个事务会造成mysql死锁。
引发以下错误:Deadlock found when trying to get lock; try restarting transaction
如果我是正确的,这个错误意味着mysql死锁超时已经过期,mysql试图做些什么来消除这个死锁。
对我来说不清楚的是,try restarting transaction是什么意思?如何“重新启动”事务?
两个锁定的事务会发生什么?他们都被取消了吗(滚回)?或者只是其中一个被取消了锁才能被释放。
提前感谢
我在访问MySQL数据库的两个应用程序中使用了UniDAC (Devart)。在一个应用程序执行一些繁重的更新更新操作期间,我偶尔会在另一个应用程序中收到错误消息"#40001 Deadlock found when restarting“。在阅读了MySQL应对此问题的提示后,他们建议重试事务。我的问题是知道在Delphi中做这件事的最好方法。我正在做这个:
transaction_completed_ok:= False;
repeat
try
my_db.StartTransaction;
(... do the inserts)
my_db.Comm
我正在使用mysql (innodb作为引擎)开发一个web应用程序。我有几个表,包括“用户”、“任务”、“任务历史”。
具有属性的“用户”:id(主键)、帐户、密码、分数等。
具有属性的“任务”:id(主键)、得分、user_id等。
带有属性的“task_histories”:id(主键)、task_id、user_id、canceled等。
现在我有了一个简单的逻辑:如果用户完成了一项任务,那么我需要将相应的分数(“任务”)添加到他的旧分数(“用户”)中。所以我有这样的java代码:
public class TaskHistoryHandler extends Sy
设想情况:
事务A启动.
START TRANSACTION;
UPDATE table_name SET column_name=column_name+1 WHERE id = 1 LIMIT 1;
同时,事务B启动.
START TRANSACTION;
UPDATE table_name SET column_name=column_name+1 WHERE id = 2 LIMIT 1;
UPDATE table_name SET column_name=column_name-1 WHERE id = 1 LIMIT 1;
COMMIT;
现在,事务B正在等待第1行,它被锁定在事务
在我的客户端应用程序中,我有一个类似这样的方法(实际上它更复杂,但我留下了主要部分):
public void btnUpdate_Click(...)
{
...
dataAdapter.Update(...);
...
dataAdapter.Fill(...); // here I got exception one time
}
我在日志中发现的异常是“尝试获取锁时发现死锁;尝试重新启动事务”。我只遇到过一次这个异常,所以它没有重复。
据我所知,DataAdapter.Fill()方法只执行select查询。我不进行显式事务,并且启用了自动提交。
那么,我如何才能在一个
我正在进行一些死锁故障排除,特别是涉及行交换的问题。
当前,语句看起来如下所示,所有语句都运行在同一个事务中:
SELECT IDENTIFIER FROM tables WHERE (TABLEID = 4 OR TABLEID = 5) AND DATE = "2015-10-31" FOR UPDATE;
/* Would imagine this would lock both of these rows.*/
UPDATE tables SET LINK=0 WHERE DATE = "2015-10-31" AND LINK = 5;
UPDA
有时,我会在我的应用程序中收到以下死锁错误:
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction
有问题的表格如下所示:
CREATE TABLE `oauth_access_token` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`access_token` text COLLATE utf8_unicode_ci NOT NULL,
`oauth_cli