SQL - 트랜잭션: 초보자 가이드
안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘 우리는 SQL 트랜잭션의 세계로 흥미로운 여정을 떠납니다. 코드를 한 줄도 작성해본 적이 없어도 걱정 마세요 - 나는 여러분의 친절한 안내자가 되겠습니다. 이 주제를 함께 단계별로 탐구해보겠습니다. 그럼 커피(또는 차, 당신의 취향에 따라)를 한 잔 마시고, 함께 들어보세요!
SQL 트랜잭션은 무엇인가요?
ATM에서 계좌에서 돈을 인출하는 상황을 생각해보세요. 이 과정에는 여러 단계가 포함됩니다: 잔액 확인, 금액 공제, 현금 지급 등이 있습니다. 그런데 ATM이 과정 중간에 고장나면 어떨까요? 돈을 잃고 싶지 않죠? 이때 트랜잭션이 유용하게 쓰입니다!
SQL에서 트랜잭션은 하나의 작업 단위로 처리되는 연속적인 연산들의序列입니다. 이는 여러분의 데이터베이스 연산 주위에 보호 비망관을 만들어, 모든 연산이 성공하거나 아예 성공하지 않도록 보장합니다. 이렇게 하면 데이터가 일관성 있고 신뢰할 수 있게 유지됩니다.
간단한 예제를 보겠습니다:
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 456;
COMMIT;
이 트랜잭션에서 우리는 한 계좌에서 100달러를 다른 계좌로 이체하고 있습니다. BEGIN TRANSACTION
은 트랜잭션의 시작을 표시하며, COMMIT
은 트랜잭션을 최종화합니다. 이 두 점 사이에서 무언가 잘못되면, 전체 트랜잭션이 취소되어 계좌가 균형을 유지합니다.
트랜잭션의 성질
트랜잭션은 네 가지 주요 성질을 가지고 있습니다. 이를 ACID라는 약자로 기억할 수 있습니다. 하나씩 설명해보겠습니다:
원자성(Atomicity)
원자성은 트랜잭션이 하나의 단일 불분할 단위로 처리된다는 것을 보장합니다. 모든 연산이 성공하거나 아예 성공하지 않는 것이 전부입니다.
일관성(Consistency)
일관성은 트랜잭션이 데이터베이스를 하나의 유효한 상태에서 다른 유효한 상태로 이동시킨다는 것을 보장합니다. 이는 무엇이든 구매해도 항상 지갑에 올바른 금액이 남아있는 것을 확인하는 것과 같습니다.
고립성(Isolation)
고립성은 트랜잭션이 서로 분리되어 진행된다는 것을 의미합니다. 공동 주택에서 자신의 사적인 방을 가지고 있는 것과 같아, 다른 트랜잭션에서 일어나는 일은 트랜잭션이 완료될 때까지 다른 트랜잭션에 영향을 미치지 않습니다.
지속성(Durability)
지속성은 트랜잭션이 커밋된 후에는 영원히 커밋된 상태로 남는다는 것을 보장합니다. 나무에 자신의 이름을 새기는 것과 같아, 폭風이 불어도 그 이름은 계속 남아 있습니다.
트랜잭션 제어 명령어
이제 트랜잭션이 무엇이고 왜 중요한지 이해했으므로, 트랜잭션을 제어하는 명령어를 살펴보겠습니다. 이를 쉽게 참조할 수 있도록 표로 정리하겠습니다:
명령어 | 설명 |
---|---|
BEGIN TRANSACTION | 새로운 트랜잭션을 시작합니다 |
COMMIT | 트랜잭션에서 변경사항을 저장합니다 |
ROLLBACK | 트랜잭션에서 변경사항을 취소합니다 |
SAVEPOINT | 트랜잭션 내에서 회귀할 수 있는 지점을 만듭니다 |
RELEASE SAVEPOINT | 트랜잭션 내에서 저장점을 제거합니다 |
SET TRANSACTION | 트랜잭션의 특성을 지정합니다 |
이제 이들 중 하나씩 자세히 탐구해보겠습니다!
COMMIT 명령어
COMMIT
명령어는 비디오 게임에서 "저장" 버튼을 누르는 것과 같습니다. 트랜잭션에서 변경사항을 최종화합니다. 다음과 같이 사용합니다:
BEGIN TRANSACTION;
INSERT INTO students (name, age) VALUES ('Alice', 20);
UPDATE courses SET available_seats = available_seats - 1 WHERE course_id = 101;
COMMIT;
이 예제에서 우리는 Alice를 과목에 등록하고 있습니다. 그녀를 학생 테이블에 추가하고, 가능 좌석 수를 줄입니다. 마지막에 COMMIT
명령어로 변경사항을 영구히 저장합니다.
ROLLBACK 명령어
ROLLBACK
은 "되돌리기" 버튼입니다. 트랜잭션 중에 무언가 잘못되면, 모든 변경사항을 취소하고 트랜잭션 시작 전 상태로 되돌립니다.
BEGIN TRANSACTION;
DELETE FROM students WHERE name = 'Bob';
-- 아이고! Bob을 지우는 건 아니었어!
ROLLBACK;
이 예제에서 우리는 Bob을 학생 테이블에서 실수로 지웠습니다. 하지만 걱정 마세요! ROLLBACK
명령어가 지우기를 되돌려줍니다.
SAVEPOINT 명령어
SAVEPOINT
는 트랜잭션 내에서 체크포인트를 만드는 것과 같습니다. 필요에 따라 이 체크포인트로 되돌릴 수 있습니다.
BEGIN TRANSACTION;
INSERT INTO courses (course_name, instructor) VALUES ('SQL 101', 'Prof. Smith');
SAVEPOINT new_course;
UPDATE instructors SET courses_taught = courses_taught + 1 WHERE name = 'Prof. Smith';
-- 아이고! Prof. Smith는 이번 학기에 휴가 중이야
ROLLBACK TO new_course;
UPDATE instructors SET courses_taught = courses_taught + 1 WHERE name = 'Prof. Johnson';
COMMIT;
이 예제에서 우리는 새로운 과목을 추가한 후에 체크포인트를 만듭니다. 잘못된 강사를 배정한 것을 깨달으면 체크포인트로 되돌리고 올바른 강사를 업데이트합니다.
RELEASE SAVEPOINT 명령어
RELEASE SAVEPOINT
명령어는 더이상 필요하지 않은 저장점을 제거합니다. 게임에서 체크포인트를 지우는 것과 같습니다.
BEGIN TRANSACTION;
SAVEPOINT update_start;
UPDATE products SET price = price * 1.1;
-- 가격 인상이 성공적이므로, 저장점이 더이상 필요하지 않습니다
RELEASE SAVEPOINT update_start;
COMMIT;
이 예제에서 우리는 제품 가격을 인상하기 전에 저장점을 만듭니다. 인상이 성공적이므로 저장점을 제거합니다.
SET TRANSACTION 명령어
SET TRANSACTION
명령어는 트랜잭션의 특성을 지정합니다. 예를 들어, 고립 수준이나 읽기 전용 상태를 설정할 수 있습니다.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;
SELECT * FROM sensitive_data;
COMMIT;
이 예제에서 우리는 트랜잭션의 고립 수준을 "READ COMMITTED"으로 설정한 후, 트랜잭션을 시작합니다. 이렇게 하면 다른 트랜잭션이 커밋한 데이터만 읽을 수 있어, 더러운 읽기를 방지할 수 있습니다.
그렇게 해서 여러분! 우리는 SQL 트랜잭션의 세계를 탐험했습니다. 트랜잭션은 무엇인지, 그리고 그것을 제어하는 명령어를 배웠습니다. 연습이 완벽을 만드는 것을 기억하시고, 안전한 테스트 환경에서 이 개념들을 실험해보세요.
트랜잭션은 처음에는 약간 추상적일 수 있지만, 데이터베이스의 안전망과 같습니다. 데이터를 일관성 있고 신뢰할 수 있게 유지합니다. 그래서 다음 번에 데이터베이스 프로젝트를 할 때, 중요한 연산을 트랜잭션으로 감싸는 것을 잊지 마세요. 미래의 자신과 사용자들이 당신을 감사할 것입니다!
행복하게 코딩하세요, 그리고 트랜잭션이 항상 성공적으로 커밋되길 바랍니다!
Credits: Image by storyset