2010-07-03 1 views
8

거래를 시작합니다.InnoDB 트랜잭션 중에 보류중인 쿼리를 검색 할 수 있습니까?

그런 다음 롤백해야합니다.

이런 식으로 "버려진"쿼리 목록을 어떻게 얻을 수 있습니까?

(PS : 물론의 나는 사전을 기록 할 수 있습니다, 이것은 더 "자연"방법으로 수행 할 수 있는지 궁금 해서요)

+0

자연스러운 방법은 미리 기록하는 것입니다. 트랜잭션이 무엇을하는지 모를 경우 어떻게 롤백 할지를 어떻게 알 수 있습니까? –

답변

1

당신이 이노를 사용하는 경우 InnoDB monitor를 살펴 및 stderr. 최상의 방법은 플랫폼에 종속되지 않으므로 응용 프로그램 (서버)에 저장하는 것입니다. 당신이 최근의 MySQL 5.1에 경우

2

이 작동합니다 :

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하여 트랜잭션이 어느 위치까지 갔는지 확인할 수 있습니다 롤백을 누르십시오.

+0

불행하게도 'ERROR 1227 (42000) : Access denied; ( –

+0

또한 어쨌든 쿼리가 없습니다 :/ –

+0

쿼리가 빠르면이 방법이 너무 빨리 작동하지 않을 수 있습니다 .Mincus가 제안한대로 InnoDB 모니터를 사용해보십시오. 그러나 쿼리가 빠르면 모니터 간격을 매우 작게 설정해야 할 수도 있습니다! –