Я не понимаю, как два повторяющихся запроса, каждый из которых удаляет одну строку из одной таблицы с использованием первичного ключа, могли зайти в тупик. Кто-нибудь может объяснить?
Мне кажется, что одна из транзакций должна была получить блокировку, а другая должна была ждать.
Вот отчет о тупиковой ситуации с запросами:
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), heap size 368
MySQL thread id 125597624, query id 3426379709 node3-int 10.5.1.119 application-devel updating
DELETE FROM `SessData` WHERE `SessKey` = '87EDF1479A275557AC8280DCA78AB886'
AND `Name` = 'CurrentRequestURL'
*** (2) TRANSACTION:
TRANSACTION 3 1439005340, ACTIVE 0 sec, process no 22419, OS thread id 1234073920 starting index read, thread declared inside InnoDB 0
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1216
MySQL thread id 125597622, query id 3426379705 node2-int 10.5.1.118 application-devel updating
DELETE FROM `SessData` WHERE `SessKey` = '87EDF1479A275557AC8280DCA78AB886'
AND `Name` = 'CurrentRequestURL'
*** WE ROLL BACK TRANSACTION (2)
Вот схема для таблицы:
CREATE TABLE `application`.`SessData` (
`SessKey` varchar(255) NOT NULL default '',
`Name` varchar(255) NOT NULL default '',
`Value` varchar(255) default NULL,
PRIMARY KEY (`SessKey`,`Name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Несколько других деталей:
MySQL version: 4.1.21
Isolation level: REPEATABLE-READ
Character set on the the above columns: latin1