Отображение открытых транзакций в MySQL


Я сделал несколько запросов без фиксации. Затем приложение было остановлено.

Как я могу отобразить эти открытые транзакции и commit или отменить их?

3 65

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.html

4.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.