Возможные причины ошибки Lock wait timeout exceeded; try restarting transaction.

Такая ошибка появляется при конкурирующих транзакциях. Когда одно подключение к БД начало транзакцию и заблокировало определенную таблицу или строку, а другое пытается что то с этой таблицей или строкой сделать. У меня в приложении как раз было два одновременных подключения к БД, но хотелось разобраться в первопричине, ведь эти два потока не обращались одновременно к одним и тем же записям, а блокироваться таблица целиком не должна.

Как оказалось, при использовании связей, блокируется не только основная таблица, но и добавление в дочернюю таблицу элемента, связанного с заблокированным невозможно. Это стало для меня сюрпризом. Вот пример: ~~~ table user id name updated

table user_log id user_id description

START TRANSACTION; UPDATE user set updated=NOW() WHERE id=1; ~~~ Если из второго подключения к БД попробовать выполнить такой запрос
~~~ INSERT INTO user_log SET user_id=1, description='XXX' ~~~ То будет ошибка "Lock wait timeout exceeded; try restarting transaction. ", при условии конечно, что определена связь order.id с order_log.order_id.

Теги:
comments powered by HyperComments