Показать открытые транзакции в MySQL - PullRequest
83 голосов
/ 29 сентября 2011

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

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

Ответы [ 3 ]

50 голосов
/ 29 сентября 2011

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

Нет открытой транзакции, 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(), чтобы узнать, изменился ли идентификатор.

Убедитесь, что ваш последний запрос (транзакция) хранится на клиенте, чтобы вы могли повторно отправить его при необходимости.
И отключите режим автоматического переподключения, потому что это опасно, вместо этого внедрите свое собственное переподключение, чтобы вы знали, когда произошло отбрасывание, и можете повторно отправить этот запрос.

33 голосов
/ 31 мая 2015

Хотя в этом случае не останется никаких транзакций, как сказал @Johan, вы можете просмотреть текущий список транзакций в InnoDB с запросом ниже, если хотите.

SELECT * FROM information_schema.innodb_trx\G

Из документа :

Таблица INNODB_TRX содержит информацию о каждой транзакции (исключая транзакции только для чтения), выполняемой в настоящее время внутри InnoDB, включая информацию о том, ожидает ли транзакция блокировки, когда транзакция началась, и операторе SQL, выполняемом транзакцией, если таковая имеется.

26 голосов
/ 29 сентября 2011

Вы можете использовать show innodb status (или show engine innodb status для более новых версий mysql), чтобы получить список всех действий, ожидающих в настоящее время в движке InnoDB. В стене вывода будут скрыты транзакции, и под каким внутренним идентификатором процесса они работают.

Вы не сможете принудительно зафиксировать или откатить эти транзакции, но вы МОЖЕТЕ убить выполняемый ими процесс 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...