거래를 시작합니다.InnoDB 트랜잭션 중에 보류중인 쿼리를 검색 할 수 있습니까?
그런 다음 롤백해야합니다.
이런 식으로 "버려진"쿼리 목록을 어떻게 얻을 수 있습니까?
(PS : 물론의 나는 사전을 기록 할 수 있습니다, 이것은 더 "자연"방법으로 수행 할 수 있는지 궁금 해서요)
거래를 시작합니다.InnoDB 트랜잭션 중에 보류중인 쿼리를 검색 할 수 있습니까?
그런 다음 롤백해야합니다.
이런 식으로 "버려진"쿼리 목록을 어떻게 얻을 수 있습니까?
(PS : 물론의 나는 사전을 기록 할 수 있습니다, 이것은 더 "자연"방법으로 수행 할 수 있는지 궁금 해서요)
당신이 이노를 사용하는 경우 InnoDB monitor를 살펴 및 stderr. 최상의 방법은 플랫폼에 종속되지 않으므로 응용 프로그램 (서버)에 저장하는 것입니다. 당신이 최근의 MySQL 5.1에 경우
이 작동합니다 :
SHOW 엔진 INNODB 상태는 이노 엔진에 대한 활성 트랜잭션의 목록이 포함되어 있습니다. 각 트랜잭션 ID와 프로세스 ID로 시작하고, 다음과 같이 약간 보이는됩니다 : 당신은 SHOW FULL PROCESSLIST 또는 INFORMATION_SCHEMA에서 얻을 수있는, MySQL의 스레드 ID가 세션의 CONNECTION_ID()에 해당합니다
---TRANSACTION 0 290328284, ACTIVE 0 sec, process no 3195, OS thread id
34831 rollback of SQL statement
MySQL thread id 18272
<query may be here>
.processlist를 사용하면 어떤 트랜잭션이 자신의 것인지 판단 할 수 있습니다. 텍스트가있는 경우 텍스트를 파싱하고 구문을 분석해야합니다.
충분하지 않은 경우 각 ROLLBACK 문 앞에 SET @PROGRESS = @PROGRESS + 1과 같은 것을 시도한 다음 쿼리가 끝날 때 DUAL에서 @PROGRESS를 SELECT하여 트랜잭션이 어느 위치까지 갔는지 확인할 수 있습니다 롤백을 누르십시오.
불행하게도 'ERROR 1227 (42000) : Access denied; ( –
또한 어쨌든 쿼리가 없습니다 :/ –
쿼리가 빠르면이 방법이 너무 빨리 작동하지 않을 수 있습니다 .Mincus가 제안한대로 InnoDB 모니터를 사용해보십시오. 그러나 쿼리가 빠르면 모니터 간격을 매우 작게 설정해야 할 수도 있습니다! –
자연스러운 방법은 미리 기록하는 것입니다. 트랜잭션이 무엇을하는지 모를 경우 어떻게 롤백 할지를 어떻게 알 수 있습니까? –