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