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

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

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

Ответ 1

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

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

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

Ответ 2

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

Вы не сможете принудительно выполнить транзакцию или откат этих транзакций, но вы можете убить процесс MySQL, выполняющий их, что существенно сводится к откату. Он убивает соединение процессов и заставляет MySQL очищать беспорядок от его левого.

Вот что вы хотели бы искать:

------------
TRANSACTIONS
------------
Trx id counter 0 140151
Purge done for trx 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.

Ответ 3

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

SELECT * FROM information_schema.innodb_trx\G

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

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