Я обнаружил такую интересную проблему в движке MySQL InnoDB, кто-нибудь может объяснить, почему движок всегда утверждает, что это тупик.
Сначала я создал таблицу с одной строкой, одним столбцом:
CREATE TABLE `SeqNum` (`current_seq_num` bigint(30) NOT NULL default '0',
PRIMARY KEY (`current_seq_num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
Query OK, 0 rows affected (0.03 sec)
mysql> insert into SeqNum values (5);
Query OK, 1 row affected (0.00 sec)
Теперь у меня есть два потока коннектора MySQL, в потоке 1:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select `current_seq_num` into @curr_seq FROM SeqNum FOR UPDATE;
Query OK, 1 row affected (0.00 sec)
Теперь, в thread2, я сделал то же самое:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select `current_seq_num` into @curr_seq FROM SeqNum FOR UPDATE;
до innodb_lock_wait_timeout по умолчанию, thread2 просто ждет, пока thread1 освободит свою эксклюзивную блокировку таблицы, и это нормально.
Однако в thread1, если я введу следующий запрос на обновление:
mysql> update SeqNum set `current_seq_num` = 8;
ERROR 1213 (40001): Deadlock found when trying to get lock;
try restarting transaction
Теперь thread2 завершает запрос на выборку, поскольку thread1 завершает работу.
Кроме того, в thread1, если я введу запрос на обновление с предложением where, он может быть выполнен очень хорошо:
mysql> update SeqNum set `current_seq_num` = 8 where `current_seq_num` =5
Query OK, 1 row affected (0.00 sec)
Может кто-нибудь объяснить это?