MySql死锁已经获得了锁

时间:2011-09-19 16:49:49

标签: mysql deadlock database-deadlocks

我遇到了困扰我的僵局。我在另一篇文章Mysql deadlock explanation needed中读到了一个无法解决我的困惑的答案。 有关SHOW INNODB STATUS的其他参考说明页面也会出现这种情况。

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

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

如果Transaction(2)锁定了 A ,那么Transaction(1)正在等待Lock A ,可能是Transaction(2)将是如果它再次要求锁定 A 会死锁?

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

我可能在对情况的解释中遗漏了一些东西,我非常感谢你的解释。

我正在使用MySql 5.1,使用Hibernate 3.

------------------------
LATEST DETECTED DEADLOCK
------------------------
110918 14:56:36
*** (1) TRANSACTION:
TRANSACTION 0 40261686, ACTIVE 0 sec, process no 1686, OS thread id 1358170432 updating or deleting
mysql tables in use 1, locked 1
LOCK WAIT 9 lock struct(s), heap size 3024, undo log entries 1
MySQL thread id 101203, query id 77147262 localhost 127.0.0.1 operator Updating
update test_table set created='2011-09-18 14:56:28', customer_id=3, ended=null, lead_id=423, message=null, modified='2011-09-18 14:56:36', priority=0, project_id=74, retries=0, started='2011-09-18 14:56:36', status='PROCESS', user_id=2, inquiry_id=1542 where id=1541
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 7148 n bits 952 index `status` of table `test_table` trx id 0 40261686 lock_mode X locks gap before rec insert intention waiting
*** (2) TRANSACTION:
TRANSACTION 0 40261595, ACTIVE 0 sec, process no 1686, OS thread id 1360034112 updating or deleting, thread declared inside InnoDB 499
mysql tables in use 1, locked 1
9 lock struct(s), heap size 3024, undo log entries 2
MySQL thread id 101209, query id 77147276 localhost 127.0.0.1 operator Updating
update test_table set created='2011-09-18 14:53:22', customer_id=3, ended=null, lead_id=401, message='', modified='2011-09-18 14:56:36', priority=0, project_id=74, retries=3, started='2011-09-18 14:55:46', status='PENDING', user_id=2, inquiry_id=1474 where id=1473
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 7148 n bits 952 index `status` of table `test_table` trx id 0 40261595 lock_mode X
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 7148 n bits 952 index `status` of table `test_table` trx id 0 40261595 lock_mode X locks gap before rec insert intention waiting
*** WE ROLL BACK TRANSACTION (1)

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

1)初始设置:

DROP TABLE IF EXISTS `knowledge`.`aaa`;
CREATE TABLE  `knowledge`.`aaa` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `message` longtext,
  `status` varchar(16) DEFAULT NULL,
  `priority` int(11) NOT NULL DEFAULT '0',
  `retries` int(8) NOT NULL DEFAULT '0',
  `modified` datetime DEFAULT NULL,
  `customer_id` int(11) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  KEY `status` (`status`),
  KEY `customer_id` (`customer_id`) -- ,
  -- CONSTRAINT `aaa_customer_fk` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=515 DEFAULT CHARSET=utf8;


insert into aaa
values (1, '', 'AAA', 0, 0, null, 1);
insert into aaa
values (2, '', 'AAA', 0, 0, null, 1);
insert into aaa
values (3, '', 'AAA', 0, 0, null, 1);

2)交易2:开始交易(我使用gui) 大概是第一次锁定交易2

select * from aaa where status = 'AAA' for update;

3)交易1:开始交易 大概等待锁定 - 顺便说一下,交易确实在等待。

insert into aaa
values (10, '', 'BBB', 0, 0, null, 1);

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

update aaa set status = 'BBB' where id = 1;
update aaa set status = 'BBB' where id = 2;

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

0 个答案:

没有答案