[mysql] MySQL에서 열린 트랜잭션 표시

커밋하지 않고 몇 가지 쿼리를 수행했습니다. 그런 다음 응용 프로그램이 중지되었습니다.

이러한 열린 트랜잭션을 표시하고 커밋하거나 취소하려면 어떻게해야합니까?



답변

이러한 열린 트랜잭션을 표시하고 커밋하거나 취소하려면 어떻게해야합니까?

열린 트랜잭션이 없으며 연결이 끊어지면 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()다시 호출 하여 식별자가 변경되었는지 확인합니다.

필요한 경우 다시 제출할 수 있도록 마지막 쿼리 (트랜잭션)를 클라이언트에 보관해야합니다.
자동 재 연결 모드를 비활성화하는 것은 위험하기 때문에 대신 자신의 재 연결을 구현하여 드롭 발생시기를 파악하고 해당 쿼리를 다시 제출할 수 있습니다.


답변

케이스에 남아있는 트랜잭션은 없지만 @Johan이 말했듯이 원하는 경우 아래 쿼리를 통해 InnoDB에서 현재 트랜잭션 목록을 볼 수 있습니다.

SELECT * FROM information_schema.innodb_trx\G

에서 문서 :

INNODB_TRX 테이블에는 트랜잭션이 잠금 대기 중인지 여부, 트랜잭션이 시작될 때 트랜잭션이 실행중인 SQL 문 (있는 경우)을 포함하여 현재 InnoDB 내에서 실행중인 모든 트랜잭션 (읽기 전용 트랜잭션 제외)에 대한 정보가 포함됩니다.


답변

당신은 사용할 수 있습니다 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 FULL PROCESSLIST  

정지 트랜잭션 복사 트랜잭션 ID를 종료하고 다음 명령을 사용하여 트랜잭션을 종료하려는 경우 :

KILL <id>    // e.g KILL 16543


답변