Откат MySQL при транзакции с потерянным / отключенным соединением - PullRequest
12 голосов
/ 30 марта 2012

Мне нужно заставить сервер MySQL откатывать транзакцию сразу после того, как его клиент отключился, потому что каждый клиент работает одновременно. Проблема может быть воспроизведена следующим образом (с использованием таблицы типа innodb)

На клиенте A:

START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... then disconnect your connection to the server

на клиенте B:

START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... lock wait time out will occur here

Я установил параметр сервера MySQL как innodb_rollback_on_timeout и использовал клиент mysql mysql --skip-reconnect на обоих клиентах. Я попробовал это, используя один сервер и два клиента в сети. Я физически отключил сеть (отключил кабель) после линии SELECT ... FOR UPDATE;. Мне нужно, чтобы другие клиенты могли немедленно использовать tblone для транзакции (заблокировать ее, обновить ее), и для этого я думаю, что сервер должен откатить транзакцию для клиента A после отключения клиента A. *

1 Ответ

12 голосов
/ 08 апреля 2012

Когда вы физически отключаете клиента, вы не отправляете обычное отключение (которое могло бы вызвать откат), и протокол MySQL не очень болтлив, поэтому сервер никогда не узнает, что клиента нет. Я думаю, что это недостаток протокола по сравнению с другими системами баз данных, где клиент и сервер взаимодействуют внутри себя гораздо больше.

В любом случае. Есть две переменные, которые вы можете изменить. Они в основном делают то же самое, но для разных клиентов.

Первый - wait_timeout , и он используется клиентами приложений, такими как java или php.

Другой - interactive_timeout , и он используется клиентом mysql (как в ваших тестах)

В обоих случаях сервер прерывает соединение через несколько секунд и при этом откатывает все транзакции и снимает все блокировки.

...