VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
기본: BEGIN, COMMIT, ROLLBACK
ROLLBACK은 START TRANSACTION 시점까지 모든 것을 되돌립니다. 데이터베이스는 트랜잭션이 시작되기 전의 상태로 남습니다.
BEGIN과 START TRANSACTION은 같습니다. 둘 다 새 트랜잭션을 시작합니다.
자동 커밋
기본적으로 MySQL은 자동 커밋 모드로 실행됩니다 — 각 문이 자기만의 트랜잭션이고, 즉시 커밋됩니다. 그래서DELETE FROM orders WHERE id = 5가 명시적인 COMMIT 없이 바로 적용됩니다.
START TRANSACTION을 호출하면 그 트랜잭션이 끝날 때까지 자동 커밋이 일시적으로 중단됩니다.
COMMIT이나 ROLLBACK을 해야 합니다. 커밋하지 않고 연결을 끊으면 MySQL은 열려 있는 트랜잭션을 롤백합니다.
격리 수준
여러 트랜잭션이 동시에 실행될 때, 격리 수준은 각 트랜잭션이 다른 트랜잭션에서 무엇을 볼 수 있는지 제어합니다. MySQL의 기본값은REPEATABLE READ입니다.
*InnoDB의 REPEATABLE READ는 갭 락으로 팬텀 리드를 방지하는데, 이것은 SQL 표준이 요구하는 것보다 엄격합니다.
READ COMMITTED는 처리량을 우선하는 애플리케이션에서 흔한 선택입니다. 더티 리드(다른 트랜잭션의 커밋되지 않은 데이터를 보는 것)는 방지하지만, 반복 불가능한 읽기(한 트랜잭션 안에서 같은 행을 두 번 읽을 때, 그 사이에 다른 트랜잭션이 커밋했다면 다른 값이 반환될 수 있는 것)는 허용합니다.
세이브포인트
세이브포인트를 사용하면 트랜잭션 전체를 포기하지 않고 일부만 롤백할 수 있습니다:트랜잭션이 다루지 않는 것
모든 MySQL 문을 롤백할 수 있는 것은 아닙니다. DDL 문(CREATE TABLE, ALTER TABLE, DROP TABLE)은 암시적 커밋을 일으킵니다 — MySQL은 이 문들을 실행하기 전에 열려 있는 트랜잭션을 커밋하고, DDL 자체는 롤백할 수 없습니다.
자주 묻는 질문
트랜잭션이 끝내 커밋되지 않으면 어떻게 되나요?
커밋하지 않고 연결을 닫으면 MySQL은 열려 있는 트랜잭션을 자동으로 롤백합니다. 서버가 충돌하면 InnoDB의 리두 로그가 시작 시 커밋된 트랜잭션을 복구하고 커밋되지 않은 트랜잭션을 롤백합니다.MyISAM에서 트랜잭션을 사용할 수 있나요?
아니요. 트랜잭션에는 트랜잭션을 지원하는 스토리지 엔진이 필요합니다. InnoDB(MySQL의 기본 엔진)는 트랜잭션을 완전히 지원합니다. MyISAM은 지원하지 않습니다 — MyISAM 테이블에 대한 문은 즉시 적용되고 롤백할 수 없습니다.트랜잭션을 얼마나 오래 열어 둘 수 있나요?
기술적으로는 필요한 만큼 오래 열어 둘 수 있지만, 오래 실행되는 트랜잭션은 락을 잡고 언두 로그 공간을 소비해서 다른 트랜잭션에 성능 문제를 일으킵니다.innodb_lock_wait_timeout 변수(기본값: 50초)는 트랜잭션이 오류를 반환하기 전에 락을 얼마나 오래 기다릴지 제어합니다. 트랜잭션을 짧게 유지하고 작업이 끝나는 즉시 커밋하세요.
문제 해결
함께 보기
- MySQL의 외래 키 — 외래 키 검사는 트랜잭션 작업의 일부입니다
- MySQL의 데드락 — 두 트랜잭션이 서로를 막을 때 일어나는 일
- MySQL의 UPSERT — 트랜잭션 안의 INSERT … ON DUPLICATE KEY UPDATE
- MySQL의 대량 삽입 — 속도를 위해 쓰기를 트랜잭션으로 묶기
- MySQL COMMIT과 ROLLBACK — 실습 예제와 함께 보는 START TRANSACTION, COMMIT, ROLLBACK