Database Commit vs Rollback
DB에서 커밋(commit)과 롤백(rollback)은 트랜잭션(transaction) 제어의 중요한 개념입니다. 이 두 개념을 잘 이해하면 데이터의 일관성을 유지하고 오류 발생 시 문제를 최소화할 수 있습니다.
1. 트랜잭션(Transaction)
트랜잭션은 데이터베이스에서 수행되는 하나의 논리적 작업 단위입니다. 여러 쿼리(INSERT, UPDATE, DELETE 등)를 하나의 묶음으로 실행하고, 모든 쿼리가 성공해야만 최종적으로 데이터베이스에 반영됩니다. 그렇지 않으면 전체 트랜잭션이 취소되어 원래 상태로 되돌아가야 합니다. 트랜잭션의 특징은 ACID라고 불리며, 아래와 같은 속성을 갖습니다.
- 원자성(Atomicity): 트랜잭션 내의 모든 작업이 모두 성공하거나 모두 실패해야 합니다.
- 일관성(Consistency): 트랜잭션이 완료되면 데이터베이스는 일관된 상태여야 합니다.
- 격리성(Isolation): 각 트랜잭션은 서로 독립적으로 수행되어야 합니다.
- 지속성(Durability): 트랜잭션이 성공적으로 완료되면 그 결과가 영구적으로 데이터베이스에 저장되어야 합니다.
2. 커밋(Commit)
커밋은 트랜잭션이 성공적으로 끝났음을 데이터베이스에 알리고, 변경된 내용을 영구적으로 저장하는 명령입니다. 예를 들어 여러 레코드를 수정하는 트랜잭션이 모두 성공했다면 COMMIT을 호출하여 모든 변경사항을 저장하고 확정 짓습니다. 커밋 후에는 데이터베이스에 반영된 변경 내용을 되돌릴 수 없습니다.
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
위 예시에서 COMMIT은 두 개의 업데이트가 성공적으로 완료되었음을 알리고 변경 내용을 데이터베이스에 저장합니다.
3. 롤백(Rollback)
롤백은 트랜잭션 중 문제가 발생하거나 명시적으로 취소할 필요가 있을 때, 트랜잭션 시작 시점으로 되돌리는 명령입니다. 즉, 트랜잭션 내의 모든 작업이 취소되고 데이터베이스는 이전 상태로 복구됩니다. 롤백을 통해 잘못된 데이터 입력, 시스템 오류 또는 무결성 제약 조건 위반 등으로 인한 문제를 방지할 수 있습니다.
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 실수로 잘못된 연산이 발생하거나 오류 발생 시
ROLLBACK;
위 예시에서 ROLLBACK은 오류가 발생하거나 잘못된 작업임을 인식했을 때 모든 변경을 취소하고, 데이터베이스를 트랜잭션 시작 전 상태로 되돌립니다.
4. 사용 사례
- 커밋 사용 사례: 사용자가 쇼핑몰에서 결제를 할 때, 모든 결제 정보와 재고 상태가 성공적으로 업데이트된 경우 COMMIT을 통해 변경을 반영합니다.
- 롤백 사용 사례: 결제 도중 카드 인증 실패나 네트워크 문제로 인해 결제가 완료되지 않은 경우 ROLLBACK을 통해 모든 변경을 취소하여 데이터의 일관성을 유지합니다.
5. 주의사항
- 자동 커밋 모드: 대부분의 데이터베이스는 기본적으로 자동 커밋 모드가 활성화되어 있습니다. 자동 커밋 모드에서는 각 SQL 명령이 실행될 때마다 즉시 커밋되므로, 중요한 작업을 수행할 때는 트랜잭션을 명시적으로 시작하고 COMMIT 또는 ROLLBACK을 제어하는 것이 좋습니다.
- 동시성 제어: 여러 사용자가 동시에 데이터베이스에 접근할 때, 트랜잭션 격리 수준을 적절하게 설정하여 데이터 일관성을 유지해야 합니다. 롤백은 데이터의 무결성을 보장하는 데 중요한 역할을 합니다.
요약하자면, 커밋과 롤백은 데이터베이스 트랜잭션을 안전하고 일관성 있게 처리하는 핵심적인 도구입니다. 커밋은 변경을 확정 짓고, 롤백은 트랜잭션 중 문제가 발생했을 때 변경을 취소하는 역할을 합니다.
'Interview > DB' 카테고리의 다른 글
MySQL Group by와 Having (0) | 2024.10.17 |
---|---|
Database Select Query (0) | 2024.10.17 |
Database에서 ACID (0) | 2024.10.14 |
DB에서 데이터 무결성 (1) | 2024.10.14 |
Database에서 DDL DML DCL (0) | 2024.10.14 |