-
최근에 생각없이 UPDATE 문에 조건을 걸지 않고 쿼리를 실행시켰다가 모든 데이터가 변경된 적이 있었다. 물론 테스트 데이터였기 때문에 큰 문제는 없었지만 만약 실 데이터라면 생각만 해도 아찔했다.
-
따라서 다음부터는 이러한 실수를 하지 않도록 쿼리를 실행하기 전에 무조건
START TRANSTAION
을 이용하여 데이터를 수정하고 실수를 했을 떄 롤백을 할 수 있도록 하려고 하였다.
START TRANSACTION; // 트랜잭션 시작
UPDATE 쿼리;
COMMIT or ROLLBACK; // 커밋 또는 롤백을 하여 데이터를 반영하거나 롤백할 수 있다.
-
위와 같은 쿼리를 실행하고 나서, 문제가 없는 것을 확인하였다 그리고 웹 사이트로 가서 특정 로우에 대해서 수정을 하는데 락이 걸려서 실행이 되지 않는 것이다. 이유는 트랜잭션이 종료되지 않아서 인 것 같았다.
-
다시 위와 같은 문제를 재현하려고하였지만, 재현할 수는 없었다.
START TRANSATION
을 한 후에, 커밋 또는 롤백을 하면 자동으로 트랜잭션이 종료되었다.
트랜잭션 조회
- 아무튼 락을 걸고 있는 프로세스를 종료 시켜줘야했다. 따라서 인터넷을 검색해보았을 때 아래와 같은 쿼리를 이용해서 조회를 하면 된다.
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
-
위의 화면은
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX
쿼리를 사용하였을 때의 조회되는 창인데, 현재INNODB
의 트랜잭션 상태 (실행중인지, 잠금 대기 중인지 여부), 트랜잭션이 시작된 시간과 같은 현재 내부에서 실행중인 모든 트랜잭션에 대한 정보를 제공한다. -
trx_mysql_thread_id
부분이 프로세스 ID 부분이라서 아래 쿼리 문을 통해서 트랜잭션을 종료 시켜주면 중지되지 않은 트랜잭션을 종료시킬 수 있다.
KILL 982;