programing

MySQL에서 열려 있는 트랜잭션 표시

nicegoodjob 2023. 2. 5. 11:40
반응형

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()ID가 변경되었는지 여부를 확인합니다.

필요한 경우 다시 제출할 수 있도록 마지막 쿼리(트랜잭션)를 클라이언트에 보관해야 합니다.
또, 자동 재접속 모드를 무효로 해 주세요.위험하기 때문에, 대신에 독자적인 재접속을 실장해, 드롭이 발생했을 때에 그 쿼리를 재발송신할 수 있도록 합니다.

@Johan님의 말씀대로 현재 거래목록은 아래 쿼리와 함께 InnoDB에서 확인하실 수 있습니다.

SELECT * FROM information_schema.innodb_trx\G

문서 내용:

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

하시면 됩니다.show innodb status (오류)show engine innodb status새로운 버전의 mysql)을 사용하여 InnoDB 엔진 내에서 현재 보류 중인 모든 액션 목록을 가져옵니다.출력의 벽에는 트랜잭션과 트랜잭션이 실행되는 내부 프로세스 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

언급URL : https://stackoverflow.com/questions/7598373/display-open-transactions-in-mysql

반응형