Здесь нет тупиков, какую версию MySQL и какой уровень изоляции вы используете?
Я получил эти результаты, добавив столбец отметки времени в таблицу B:
Thread1 > BEGIN;
Thread1 > SELECT * FROM A WHERE ID=1000 FOR UPDATE;
/* 0 rows affected, 1 rows found */
Thread2 > BEGIN;
Thread2 > INSERT INTO B (AID, NAME, date) VALUES (1000, 'Hello world', NOW());
[Hangs]
-- after 5 seconds
Thread1 > INSERT INTO B (AID, NAME, date) VALUES (1000, 'Hello world2', NOW());
/* 1 rows affected, 0 rows found */
Thread1 > COMMIT;
Thread2 > COMMIT;
B будет содержать 2 строки, которые выглядят так:
- 1000 «Hello world» 2011-06-11 19: 23: 15 '
- 1000 'Hello world2' '2011-06-11 19: 23: 20'
Описанная вами ситуация имеет место, только если B.NAME является уникальным индексом, и вы пытаетесь вставить те же значения. Первая вставка ожидает освобождения индекса A.ID, что никогда не произойдет из-за дублирования значения B.NAME.