START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- 실수로 에러가 발생한 경우
ROLLBACK;
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT sp1;
UPDATE accounts SET balance = balance - 50 WHERE id = 2;
ROLLBACK TO sp1; -- sp1으로 롤백
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION: 트랜잭션 시작.COMMIT 또는 ROLLBACK: 성공 시 COMMIT, 실패 시 ROLLBACK.START TRANSACTIONSAVEPOINTROLLBACK TO SAVEPOINTCOMMIT 또는 ROLLBACK트랜잭션 간 간섭을 방지하기 위한 격리 수준을 설정합니다.
| 격리 수준 | 설명 | 읽기 현상 |
|---|---|---|
| READ UNCOMMITTED | 커밋되지 않은 데이터를 읽을 수 있음. (Dirty Read 가능) | Dirty Read, Non-repeatable Read, Phantom Read |
| READ COMMITTED | 커밋된 데이터만 읽을 수 있음. (Non-repeatable Read 가능) | Non-repeatable Read, Phantom Read |
| REPEATABLE READ | 동일 트랜잭션 내에서는 동일 데이터만 읽음. (Phantom Read 가능) | Phantom Read |
| SERIALIZABLE | 트랜잭션을 순차적으로 실행하여 완벽한 격리 보장. (가장 느리지만 완벽한 일관성 제공) | 없음 |
START TRANSACTION;
-- 데이터 변경
UPDATE products SET stock = stock - 1 WHERE product_id = 101;
INSERT INTO orders (order_id, product_id, quantity) VALUES (1, 101, 1);
-- 트랜잭션 저장
COMMIT;
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT sp1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- sp1으로 롤백
ROLLBACK TO sp1;
COMMIT;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;SELECT * FROM accounts WHERE id = 1 FOR UPDATE; -- 배타 락
CREATE, DROP, ALTER 등)는 자동으로 COMMIT을 발생시킵니다.START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- DDL 실행 (자동 COMMIT 발생)
CREATE TABLE new_table (id INT);
-- 이후 트랜잭션은 유효하지 않음
ROLLBACK; -- 아무 효과 없음
COMMIT하거나 ROLLBACK한 후에 DDL 실행.autocommit 설정에 따라 트랜잭션 동작이 달라질 수 있습니다.START TRANSACTION을 명시적으로 호출하지 않으면 각 쿼리가 자동으로 커밋됩니다.-- 자동 커밋 상태 확인
SELECT @@autocommit;
-- 자동 커밋 비활성화
SET autocommit = 0;
트랜잭션이 짧고 간결하게 유지되도록 설계.
잠금 대상을 최소화:
SELECT * FROM accounts WHERE id = 1 FOR UPDATE; -- 특정 행 잠금
Deadlock 감지 및 회피:
redo log)가 가득 차면 성능 저하 발생.SHOW VARIABLES LIKE 'innodb_log_file_size';
SET GLOBAL innodb_log_file_size = 256M;