1. 트랜잭션이란?
트랜잭션은 데이터베이스에서 여러 SQL 문을 하나의 작업 단위로 묶어 실행합니다. 모든 작업이 성공해야 적용되며, 하나라도 실패하면 전체가 취소됩니다.
요약
- 트랜잭션은 데이터베이스에서 하나의 논리적 작업 단위입니다.
- 여러 SQL 명령어를 묶어 "전부 성공"하거나 "전부 실패"하도록 보장합니다.
- 실생활 예: 은행 송금
- A가 B에게 5만 원 송금: A 계좌에서 5만 원 감소, B 계좌에서 5만 원 증가
- 두 작업이 모두 성공해야 데이터가 올바름
트랜잭션의 중요성
- 데이터 무결성 유지: 부분 성공/실패로 인한 오류 방지
- 예: 송금 중 시스템 오류 발생 시, 돈이 사라지거나 중복 지급되지 않도록 보호
질문: 트랜잭션이 없다면 은행 송금에서 어떤 문제가 생길까?
트랜잭션이 없는 은행 송금의 문제
- 부분 완료: 출금은 성공했지만 입금이 실패해 돈이 사라짐. (예: A 계좌에서 10만 원 차감 후 B 계좌 입금 실패)
- 데이터 불일치: 잔고가 음수가 되거나 송금 데이터가 일관성 없음.
- 동시 접근 충돌: 여러 송금이 동시에 처리되어 잔고 계산 오류. (예: A 계좌에서 B와 C로 동시 송금)
- 데이터 손실: 시스템 장애로 송금 기록 사라짐.
- 결과: 재무적 손실과 은행 신뢰도 하락.
2. COMMIT과 ROLLBACK
COMMIT
- 역할: 트랜잭션의 모든 변경사항을 데이터베이스에 영구 저장
- 사용 시점: 모든 작업이 성공적으로 완료되었을 때
- 예: 송금이 정상적으로 처리된 후 데이터베이스에 반영
ROLLBACK
- 역할: 트랜잭션의 모든 변경사항을 취소하고 이전 상태로 복구
- 사용 시점: 오류 발생 또는 작업 실패 시
- 예: 잔액 부족으로 송금이 불가능할 때
MySQL 트랜잭션 명령어
- START TRANSACTION: 트랜잭션 시작
- COMMIT: 변경사항 저장
- ROLLBACK: 변경사항 취소
- 기본 구조
START TRANSACTION;
-- SQL 명령어
COMMIT; -- 성공 시
-- 또는
ROLLBACK; -- 실패 시
MySQL 8.0 팁: InnoDB는 자동 커밋(autocommit)이 기본으로 활성화되어 있습니다. 트랜잭션을 수동으로 제어하려면 START TRANSACTION을 사용하세요.
동적으로 쿼리 작성하기
-- MySQL 워크 밴치에서 트랜잭션 사용해보기
-- 홍길동 계좌에서 이순신 계좌로 20만원 이체 요청
set autocommit = 0;
start transaction;
-- 홍길동 계좌에 잔액 확인
set @bal = (select balance from accounts where account_id = 1);
-- 잔액이 충분하다면 true, 아니면 false
set @is_valid = (@bal >= 50000);
-- 홍길동 계좌에 잔액 수정 처리
update accounts
set balance = balance - 50000
where account_id = 1 and @is_valid;
-- 이순신 계좌에 잔액을 수정 처리
update accounts
set balance = balance + 50000
where account_id = 2 and @is_valid;
select * from accounts;
-- if(@is_valid, commit, rollback);
-- commit where @is_valid;
-- rollback where @is_valid;
'MySQL' 카테고리의 다른 글
| MySQL ANSI SQL 표준과 주요 함수 (0) | 2025.05.16 |
|---|---|
| 테이블 복사 및 데이터 추가 (0) | 2025.05.16 |
| MySQL 별칭, 변수 선언, IF 문 (0) | 2025.05.15 |
| MySQL JOIN (0) | 2025.05.14 |
| blog 구성해보기 (0) | 2025.05.13 |