Я сделал несколько запросов без фиксации. Потом приложение было остановлено.
Как я могу отобразить эти открытые транзакции и зафиксировать или отменить их?
Я сделал несколько запросов без фиксации. Потом приложение было остановлено.
Как я могу отобразить эти открытые транзакции и зафиксировать или отменить их?
Ответы:
Как я могу отобразить эти открытые транзакции и зафиксировать или отменить их?
Нет открытой транзакции, 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()
раз, чтобы узнать, изменился ли идентификатор.
Убедитесь, что вы сохранили свой последний запрос (транзакцию) в клиенте, чтобы при необходимости можно было отправить его повторно.
И отключите режим автоматического переподключения, поскольку это опасно, вместо этого реализуйте собственное переподключение, чтобы вы знали, когда происходит сбой, и могли повторно отправить этот запрос.
mysqld.dll
AKA клиент. И вы храните SQL-оператор , содержащий полную транзакцию, в памяти, чтобы вы могли воспроизвести его при разрыве соединения. Или вы храните его локально на диске, чтобы после перезапуска вы могли повторно отправить его.
Хотя в этом случае не будет оставшейся транзакции, как сказал @Johan, вы можете увидеть текущий список транзакций в InnoDB с запросом ниже, если хотите.
SELECT * FROM information_schema.innodb_trx\G
Из документа :
Таблица INNODB_TRX содержит информацию о каждой транзакции (исключая транзакции только для чтения), которые в настоящее время выполняются внутри InnoDB, в том числе, ожидает ли транзакция блокировки, когда транзакция началась, и SQL-запрос, который транзакция выполняет, если есть.
\G
модификатор в конце полезен только в том случае, если вы хотите отформатировать вывод запроса в инструменте mysql CLI. Если вы используете инструмент с графическим интерфейсом, такой как Mysql Workbench, он вам не нужен.
Вы можете использовать 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
.
show engine innodb status
?
Список всех:
SHOW FULL PROCESSLIST
если вы хотите убить идентификатор транзакции копии зависшей транзакции и уничтожить транзакцию с помощью этой команды:
KILL <id> // e.g KILL 16543