Подтвердить что ты не робот

Откат MySQL по транзакции с потерянным/отключенным соединением

Мне нужно сделать 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 client mysql --skip-reconnect на обоих клиентах. Я попробовал это, используя один сервер и два клиента в сети. Я отключил сеть физически (отсоедините кабель) после строки SELECT ... FOR UPDATE;. Мне нужно, чтобы другие клиенты могли использовать tblone для транзакции (заблокировать ее, обновить) немедленно, и для этого я думаю, что сервер должен отменить транзакцию для клиента A после того, как Клиент А отключится.

4b9b3361

Ответ 1

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

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

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

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

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