Откат 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 после того, как Клиент А отключится.
Ответы
Ответ 1
Когда вы физически отключите клиента, вы не отправляете нормальное отключение (что вызвало откат), а протокол MySQL не очень частый, поэтому сервер никогда не знает, что клиента там нет. Я думаю, что это недостаток в протоколе по сравнению с другими системами баз данных, где клиент и сервер чаще говорят о себе.
В любом случае. Есть две переменные, которые вы могли бы изменить. Они в основном делают то же самое, но для разных клиентов.
Первый wait_timeout, и он используется клиентами приложений, такими как java или php.
Другой interactive_timeout и используется клиентом mysql (как и в ваших тестах)
В обоих случаях сервер убивает соединение через несколько секунд и при этом откатывает все транзакции и освобождает все блокировки.