Я сделал несколько запросов без фиксации. Затем приложение было остановлено.
Как я могу отображать эти открытые транзакции и фиксировать или отменять их?
Я сделал несколько запросов без фиксации. Затем приложение было остановлено.
Как я могу отображать эти открытые транзакции и фиксировать или отменять их?
Как я могу отображать эти открытые транзакции и фиксировать или отменять их?
Нет открытой транзакции, 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()
, чтобы узнать, был ли изменен идентификатор.
Убедитесь, что вы сохраняете свой последний запрос (транзакцию) на клиенте, чтобы его можно было повторно отправить, если это необходимо.
И отключите режим автоматического повторного подключения, потому что это опасно, вместо этого выполните собственное пересоединение, чтобы вы знали, когда происходит падение, и вы можете повторно отправить этот запрос.
Вы можете использовать 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
.
Хотя в этом случае не будет никакой оставшейся транзакции, как сказал @Johan, вы можете увидеть текущий список транзакций в InnoDB с запросом ниже, если хотите.
SELECT * FROM information_schema.innodb_trx\G
Из документа:
В таблице INNODB_TRX содержится информация обо всех транзакциях (исключая транзакции только для чтения), которые в настоящее время выполняются внутри InnoDB, включая то, ожидает ли транзакция блокировки, когда транзакция началась, и оператор SQL, выполняемый транзакцией, если таковой имеется.