Отображение открытых транзакций в MySQL
Я сделал несколько запросов без фиксации. Затем приложение было остановлено.
Как я могу отобразить эти открытые транзакции и commit или отменить их?
3 ответа:
как я могу отобразить эти открытые транзакции и commit или отменить их?
нет открытой транзакции, MySQL откатит транзакцию при повторном подключении.
Вы не можете зафиксировать транзакцию (IFAIK).вы показываете потоки с помощью
SHOW FULL PROCESSLIST
см.:http://dev.mysql.com/doc/refman/5.1/en/thread-information.html
Это не поможет вам, потому что вы не можете совершать сделки от нарушена связь.
что происходит при разрыве соединения
Из документов MySQL:http://dev.mysql.com/doc/refman/5.0/en/mysql-tips.html4.5.1.6.3. Отключение автоматического повторного подключения mysql
если клиент mysql теряет соединение с сервером при отправке инструкции, он немедленно и автоматически пытается повторно подключиться к серверу и отправить инструкцию снова. , даже если mysql преуспевает в повторном подключении, ваше первое соединение закончилось, и все ваши предыдущие объекты сеанса и настройки проиграл: временные таблицы, режим автоматической фиксации, а также пользовательские и сессионные переменные. Кроме того,любая текущая транзакция откатывается.
это поведение может быть опасным для вас, как в следующем примере, где сервер был выключен и перезапущен между первым и вторым операторами без вашего ведома:
Также см.:http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html
как диагностировать и исправить это
Чтобы проверить автоматическое переподключение:если автоматическое переподключение действительно происходит (например, в результате вызова mysql_ping ()), нет явного указания на это. Чтобы проверить возможность повторного подключения, позвоните
mysql_thread_id()
чтобы получить исходный идентификатор соединения перед вызовомmysql_ping()
, тогда звонитеmysql_thread_id()
еще раз, чтобы увидеть, изменился ли идентификатор.убедитесь, что вы сохраняете свой последний запрос (транзакцию) в клиенте, чтобы вы могли повторно отправить его, если это необходимо.
И отключите режим автоматического повторного подключения, потому что это опасно, вместо этого реализуйте свое собственное повторное подключение, чтобы вы знали, когда происходит отбрасывание, и вы можете повторно отправить этот запрос.
хотя в этом случае не будет никакой оставшейся транзакции, как сказал @Johan, вы можете увидеть текущий список транзакций в InnoDB с запросом ниже, если хотите.
SELECT * FROM information_schema.innodb_trx\G
С документ:
таблица INNODB_TRX содержит информацию о каждой транзакции (исключая транзакции только для чтения), выполняемой в настоящее время внутри InnoDB, в том числе ожидает ли транзакция блокировки, когда транзакция запущен, и инструкция SQL, которую выполняет транзакция, если таковая имеется.
можно использовать
show innodb status
(илиshow engine innodb status
для более новых версий mysql), чтобы получить список всех действий, в настоящее время ожидающих внутри InnoDB engine. В стене вывода будут похоронены транзакции и какой внутренний идентификатор процесса они работают.вы не сможете принудительно зафиксировать или откатить эти транзакции, но вы можете убить процесс MySQL, выполняющий их, что по существу сводится к откату. Это убивает соединение процессов и заставляет MySQL убирать ее оставил.
вот что вы хотели бы искать:
------------ TRANSACTIONS ------------ Trx id counter 0 140151 Purge done for trx's n:o < 0 134992 undo n:o < 0 0 History list length 10 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 0 0, not started, process no 17004, OS thread id 140621902116624 MySQL thread id 10594, query id 10269885 localhost marc show innodb status
в этом случае есть только одно соединение с двигателем InnoDB прямо сейчас (мой логин, запуск
show
запрос). Если бы эта строка была фактической транзакцией соединения / зависания, которую вы хотите прекратить, вы бы сделалиkill 10594
.