데이터베이스를 다루는 개발자라면 트랜잭션(Transaction) 과 COMMIT/ROLLBACK 개념은 반드시 이해해야 한다. 이 글에서는 SQL 단계에서의 트랜잭션 개념을 잡고, 실제 예제를 통해 COMMIT/ROLLBACK을 체감한 뒤, 실무에서 자주 사용하는 Spring Boot @Transactional까지 확장해 보겠다.
트랜잭션(Transaction) 개념
- 트랜잭션: 데이터베이스에서 실행되는 하나의 논리적 작업 단위
- 예: 장바구니 담기 → 결제 완료 → 재고 차감 → 영수증 발행
- 트랜잭션은 원자성(Atomicity) 을 가져야 한다.
- 즉, 모두 성공하거나, 전부 실패해야 한다는 뜻이다.
COMMIT의 필요성과 역할
COMMIT은 트랜잭션을 최종 확정하는 명령어이다.
- COMMIT 전 → 변경 사항이 임시 저장, 다른 사용자는 볼 수 없음
- COMMIT 후 → 변경 사항이 모든 사용자에게 확정

- 위 예시는 은행 계좌 이체의 과정이다.
- 두 UPDATE 모두 성공해야 의미가 있으며, COMMIT이 있어야 DB에 확정된다.
COMMIT이 필요한 이유
- 데이터 무결성 보장
- COMMIT 없이 오류나 장애가 발생하면 불완전한 데이터가 남을 수 있다.
- 예: 돈은 빠졌는데 상대방 계좌에는 들어가지 않은 상태
- 작업 단위 관리
- 여러 SQL을 하나의 묶음으로 관리할 수 있다.
- 전부 성공해야 의미 있는 작업을 보장한다.
- ROLLBACK과 짝꿍
- COMMIT 전 → ROLLBACK으로 취소 가능
- COMMIT 후 → 되돌릴 수 없음 → 진짜 확정
COMMIT과 SQL 명령어의 관계
- SELECT
- 조회만 하는 명령어이기 때문에 COMMIT이 불필요하다.
- DML (INSERT, UPDATE, DELETE)
- 데이터를 변경하는 명령어이기 때문에 COMMIT이 필요하다.
- COMMIT 전에는 ROLLBACK으로 취소할 수 있다.

- DDL (CREATE, DROP, ALTER)
- 스키마 변경 명령어 → 자동 COMMIT 발생
- 따라서 ROLLBACK 불가
- DCL (GRANT, REVOKE)
- 권한 관련 명령어 → 자동 COMMIT 발생
- 따라서 ROLLBACK 불가
COMMIT 필요한 경우: DML
COMMIT 필요 없는 경우: SELECT
자동 COMMIT 되는 경우: DDL, DCL
실습: 은행 계좌 이체 예제
(1) 계좌 테이블 생성

- DDL은 자동 COMMIT된다.
(2) 초기 데이터 삽입

(3) 트랜잭션 시작

(4) 계좌 이체 (영희 → 철수, 30,000원)

(5) 결과 확인 (아직 내 세션에서만 반영됨)

- 아직 COMMIT 전이라 다른 사용자에게는 보이지 않는다.
(6) 실수했을 때 → ROLLBACK

- 다시 조회하면 원래대로 돌아온다.

(7) 정상 처리 시 → COMMIT

- 이제서야 변경 사항이 DB에 확정된다.
- 이제 다른 사용자도 동일한 결과를 확인할 수 있다.
Spring Boot에서의 트랜잭션 관리
실무에서는 SQL에서 직접 COMMIT/ROLLBACK을 쓰지 않고, 애플리케이션 코드에서 트랜잭션을 관리한다. Spring Boot에서는 @Transactional을 사용해 자동으로 관리할 수 있다.

@Transactional 동작 원리
- 메서드 시작 시 → 트랜잭션 시작
- 메서드 정상 종료 → COMMIT
- 런타임 예외 발생 → ROLLBACK
실무 활용 규칙
- 조회 전용 메서드 → @Transactional(readOnly = true)
- 성능 최적화: Hibernate/JPA 같은 ORM에서 더 효율적으로 동작한다 (쓰기 관련 기능을 차단).
- COMMIT이 불필요: 데이터를 수정하지 않으므로 트랜잭션 커밋이 필요 없다.
- 읽기 전용 쿼리라면 readOnly = true로 선언해서 성능도 챙기고, 불필요한 DB 부하를 줄이자.
- 서비스 계층(Service Layer)에서 트랜잭션 선언
- 위치: 트랜잭션은 Service Layer에 선언하는 것이 원칙이다.
- 이유
- DAO/Repository: 단순히 SQL/쿼리 실행만 담당한다 (DB 접근).
- Service: 비즈니스 로직 단위(여러 DAO 호출 포함)를 묶어서 트랜잭션을 관리한다.
- 장점: 한 서비스 로직이 여러 DB 작업을 수행하더라도, 전체를 하나의 트랜잭션 단위로 보장할 수 있다.
- 트랜잭션은 DB 쿼리 단위가 아니라 비즈니스 로직 단위에서 관리해야 한다.
- 예외 처리
- 기본 규칙
- 런타임 예외(RuntimeException) 발생 시 → 자동 ROLLBACK
- 체크 예외(Exception 계열 중 체크 예외) 발생 시 → ROLLBACK 안 됨
- 필요하다면 @Transactional(rollbackFor = Exception.class)로 설정해서 체크 예외도 ROLLBACK 되도록 만들 수 있다.
- Spring은 기본적으로 런타임 예외만 롤백한다. 하지만 필요하면 rollbackFor로 롤백 대상을 확장할 수 있다.
- 기본 규칙
SQL vs Spring Boot 비교

정리하자면…
- COMMIT은 데이터베이스에서 변경 사항을 확정하는 버튼이다.
- DML은 COMMIT이 필요하고, SELECT는 불필요하다. DDL/DCL은 자동 COMMIT된다.
- ROLLBACK은 COMMIT 전까지만 유효하다.
- SQL에서는 직접 제어해야 하지만, Spring Boot에서는 @Transactional로 선언적 관리를 할 수 있다.
- 실무에서는 서비스 계층에 트랜잭션을 두어 비즈니스 단위로 COMMIT/ROLLBACK 관리하는 것이 표준이다.
학습 단계에서는 SQL 수준에서 COMMIT/ROLLBACK을 이해하는 것이 중요하고, 실무 단계에서는 Spring Boot의 @Transactional을 활용해 안정적이고 일관성 있는 트랜잭션 처리를 구현하는 것이 중요하다.
'DB' 카테고리의 다른 글
| SQL 단일행 함수 정리 (1) | 2025.09.27 |
|---|---|
| SQL DDL & 제약조건 실습 정리 (1) | 2025.09.23 |
| SQL DDL & 제약조건 정리 (0) | 2025.09.22 |
| SQL DML 기본 문법 정리 (CRUD 중심) (0) | 2025.09.19 |
| 데이터베이스(DB) 기본 (1) | 2025.09.18 |