김대용
DB

MySQL START TRANSACTION과 SET autocommit = 0의 차이

--------------------

MySQL에서는 트랜잭션을 시작할 때 평소 START TRANSACTION 구문을 사용했다. autocommit 모드가 비활성화되어있을 때와 무슨 차이가 있는지 궁금해졌다. MyISAM 엔진은 트랜잭션을 지원하지 않아 아래 내용은 해당되지 않는다. InnoDB 엔진 기준으로 설명한다.

이 두가지 방법은 각각 명시적, 묵시적 트랜잭션이라고 불린다.

묵시적 트랜잭션

autocommit 모드가 활성화 되어있으면 DML 구문 실행 동시에 자동으로 트랜잭션이 같이 실행되고 커밋된다. 구문 실행이 실패하면 자동으로 롤백된다. 커밋이 바로되므로 롤백을 할 수 없다. 따라서 무언갈 잘못했다면 백업을 활용하거나 기억을 되살려 되돌릴 수 밖에 없다.

MySQL은 기본적으로 autocommit 모드가 활성화되어있다. 이 모드를 비활성화 하는 법은 SET autocommit = 0을 실행하면 된다. 비활성화됐을 땐 DML 구문 실행 동시에 트랜잭션이 실행되고 수동으로 커밋이나 롤백을 해야한다. 이 상태를 묵시적 트랜잭션이라고 한다.

명시적 트랜잭션

BEGIN 또는 START TRANSACTION을 사용해 트랜잭션을 실행할 때는 명시적 트랜잭션이라고 한다. 이는 autocommit 모드를 트랜잭션이 실행되는동안 비활성화시키고, 트랜잭션이 끝나면 그 전 상태로 되돌린다.

결론

둘다 동일한 트랜잭션의 역할을 하나, 트랜잭션의 시작을 명시하는 명시적 트랜잭션을 추천한다.

  • 읽는 사람이 이 쿼리가 트랜잭션이 필요하다는걸 알 수 있다.
  • autocommit 모드의 활성 여부와 전혀 무관해 실수가 일어날 가능성이 적다.

참조

--------------------