3

私は困惑するデッドロックに遭遇しました。別の投稿Mysqlデッドロックの説明には、私の混乱を解決しない答えが必要でした。この状況は、 SHOW INNODB STATUSに関する別の参照された説明ページでも捉えられています。

インスタンスもアタッチしています。これは、インデックスをロックしているため、ギャップがある場合とない場合があるため、少し異なります。

しかし、主な質問はまだ同じだと思います:

トランザクション (2) がロックAを持っている場合、トランザクション (1) はロックAを待機しています。ロックAを再度要求すると、トランザクション (2) がデッドロックされる可能性がありますか?

これは正しくないように思えますが、それは InnoDb Status に表示されるものです。さまざまなトランザクションにさまざまなタブを使用して、MySql で直接再作成しようとすると、すべて正常に動作し、そのようなデッドロックは発生しません。また、無駄な再作成の試みを添付しています。

状況の解釈に何かが欠けている可能性があります。適切な説明をいただければ幸いです。

Hibernate 3でMySql 5.1を使用しています。

------------------------
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: おそらくトランザクション 2 の最初のロックを取得してトランザクションを開始します (私は GUI を使用します)。

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 をコミットでき、すべて問題ありません...デッドロック状況の再現はありません..

4

0 に答える 0