MySQL Transactions and Rollback


트랜잭션은 데이터베이스에서 수행되는 하나의 작업 단위로, 여러 SQL 문을 하나의 단위로 묶어서 처리합니다. 트랜잭션은 데이터의 일관성과 무결성을 유지하는 데 중요한 역할을 하며, 데이터베이스에서 발생할 수 있는 오류나 예외 상황에 대응할 수 있도록 합니다. 트랜잭션은 ACID 특성을 충족해야 합니다.

트랜잭션 개념과 ACID 특성 (Transaction Concept and ACID Properties)

트랜잭션 (Transaction)

트랜잭션은 데이터베이스의 상태를 변화시키는 작업의 단위입니다. 하나의 트랜잭션은 여러 개의 SQL 문으로 구성될 수 있으며, 이들 SQL 문은 모두 성공적으로 실행되어야만 최종적으로 데이터베이스에 반영됩니다. 트랜잭션의 주요 목적은 데이터베이스의 일관성을 유지하는 것입니다.

ACID 특성 (ACID Properties)

트랜잭션은 ACID 특성을 만족해야 합니다. ACID는 다음의 네 가지 특성을 의미합니다:

  1. 원자성 (Atomicity): 트랜잭션의 모든 작업은 완전히 수행되거나 전혀 수행되지 않아야 합니다. 즉, 트랜잭션 내의 작업은 하나의 단위로 처리되며, 일부 작업만 수행되는 일이 없어야 합니다.
  2. 일관성 (Consistency): 트랜잭션이 완료되면 데이터베이스는 일관된 상태를 유지해야 합니다. 즉, 트랜잭션의 시작과 끝 사이에 데이터베이스의 무결성 제약 조건이 유지되어야 합니다.
  3. 격리성 (Isolation): 동시에 실행되는 트랜잭션은 서로의 작업에 영향을 미치지 않아야 합니다. 트랜잭션은 독립적으로 수행되어야 하며, 다른 트랜잭션의 중간 상태를 볼 수 없어야 합니다.
  4. 지속성 (Durability): 트랜잭션이 커밋되면, 그 결과는 시스템 장애가 발생하더라도 영구적으로 유지되어야 합니다. 트랜잭션이 완료된 후의 데이터 변경 사항은 모든 상황에서도 보장되어야 합니다.

트랜잭션 제어문 (Transaction Control Statements)

MySQL에서는 트랜잭션을 제어하기 위해 다음과 같은 명령어를 사용합니다:

BEGIN (또는 START TRANSACTION)

트랜잭션을 시작하는 명령어입니다. 트랜잭션이 시작되면, 그 트랜잭션에 포함된 모든 SQL 문은 하나의 단위로 처리됩니다.

예제: 트랜잭션 시작

-- 트랜잭션 시작
START TRANSACTION;
-- 또는
BEGIN;

COMMIT

트랜잭션의 모든 작업을 확정하여 데이터베이스에 반영하는 명령어입니다. COMMIT이 호출되면, 트랜잭션 내의 모든 변경 사항이 데이터베이스에 영구적으로 적용됩니다.

예제: 트랜잭션 커밋

-- 트랜잭션 완료 및 변경 사항 데이터베이스에 반영
COMMIT;

ROLLBACK

트랜잭션 내에서 발생한 모든 작업을 취소하고, 트랜잭션이 시작되기 전의 상태로 되돌리는 명령어입니다. ROLLBACK은 트랜잭션 도중 오류가 발생했을 때 데이터의 일관성을 유지하기 위해 사용됩니다.

예제: 트랜잭션 롤백

-- 트랜잭션 취소 및 데이터베이스 상태 원상복구
ROLLBACK;

트랜잭션과 롤백 예제 (Examples of Transactions and Rollback)

트랜잭션과 롤백의 개념을 이해하기 위해, 간단한 예제를 살펴보겠습니다. 다음은 은행 계좌 간의 금액 이체를 시뮬레이션하는 트랜잭션 예제입니다.

예제: 트랜잭션을 사용한 은행 계좌 이체

-- 트랜잭션 시작
START TRANSACTION;

-- 계좌 A에서 1000원 출금
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 'A';

-- 계좌 B에 1000원 입금
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 'B';

-- 모든 작업이 성공적으로 완료되면 커밋
COMMIT;

위의 예제에서, 계좌 A에서 1000원을 출금하고 계좌 B에 1000원을 입금하는 작업을 트랜잭션으로 묶어 처리합니다. 만약 이 중 하나의 작업이라도 실패하면, ROLLBACK을 통해 모든 작업을 취소할 수 있습니다.

예제: 트랜잭션 도중 오류 발생 시 롤백

-- 트랜잭션 시작
START TRANSACTION;

-- 계좌 A에서 1000원 출금
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 'A';

-- 계좌 B에 1000원 입금 (오류가 발생할 수 있는 코드)
-- 예: UPDATE accounts SET balance = balance + 1000 WHERE account_id = 'B';
-- 오류 발생 시 롤백
ROLLBACK;

위의 예제에서 오류가 발생하면 ROLLBACK을 통해 트랜잭션을 취소하고, 계좌 A에서 출금한 1000원을 되돌립니다. 이로써 데이터베이스의 일관성을 유지할 수 있습니다.

결론 (Conclusion)

트랜잭션과 롤백은 데이터베이스 작업의 원자성, 일관성, 격리성 및 지속성을 보장하는 데 필수적인 개념입니다. 트랜잭션을 적절히 활용하면 데이터의 무결성을 유지하면서 복잡한 데이터 작업을 안전하게 수행할 수 있습니다. 또한, 트랜잭션 도중 오류가 발생할 경우 ROLLBACK을 통해 모든 작업을 취소하고 데이터베이스를 원래 상태로 되돌릴 수 있습니다. 이를 통해 데이터베이스의 신뢰성과 안정성을 높일 수 있습니다.


Leave a Reply

Your email address will not be published. Required fields are marked *