커밋하지 않고 몇 가지 쿼리를 수행했습니다. 그런 다음 응용 프로그램이 중지되었습니다.
이러한 열린 트랜잭션을 표시하고 커밋하거나 취소하려면 어떻게해야합니까?
커밋하지 않고 몇 가지 쿼리를 수행했습니다. 그런 다음 응용 프로그램이 중지되었습니다.
이러한 열린 트랜잭션을 표시하고 커밋하거나 취소하려면 어떻게해야합니까?
답변:
이러한 열린 트랜잭션을 표시하고 커밋하거나 취소하려면 어떻게해야합니까?
열린 트랜잭션이 없으며 연결이 끊어지면 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 테이블에는 트랜잭션이 잠금 대기 중인지 여부, 트랜잭션이 시작될 때 트랜잭션이 실행중인 SQL 문 (있는 경우)을 포함하여 현재 InnoDB 내에서 실행중인 모든 트랜잭션 (읽기 전용 트랜잭션 제외)에 대한 정보가 포함됩니다.
\G
당신은 MySQL의 CLI 도구 내에서 쿼리 결과를 포맷 할 경우 마지막에 수정에만 유용합니다. Mysql Workbench와 같은 GUI 도구를 사용하는 경우 필요하지 않습니다.
당신은 사용할 수 있습니다 show innodb status
(또는 show engine innodb status
현재 이노 엔진 내부에 대기중인 모든 작업의 목록을 얻으려면 MySQL의의 새 버전). 출력 벽에는 트랜잭션과 트랜잭션이 실행되는 내부 프로세스 ID가 묻혀 있습니다.
이러한 트랜잭션을 강제로 커밋하거나 롤백 할 수는 없지만 트랜잭션을 실행하는 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
정지 트랜잭션 복사 트랜잭션 ID를 종료하고 다음 명령을 사용하여 트랜잭션을 종료하려는 경우 :
KILL <id> // e.g KILL 16543