SQL

MYSQL 엔진의 데이터 트랜잭션

하루이2222 2024. 7. 25. 22:34

트랜잭션은 기본적으로 데이터베이스의 개념임. 데이터베이스 트랜잭션은 일련의 데이터베이스 작업이 완전하게 실행되거나 전혀 실행되지 않도록 보장함으로써 데이터의 일관성과 무결성을 유지하는데 사용됨.

대부분의 현대 SQL 데이터베이스 엔진은 트랜잭션을 지원함. MySQL, PostgreSQL, Oracle, SQL Server 등은 모두 트랜잭션을 지원하며, 각 데이터베이스 시스템은 트랜잭션 관리 및 구현에 대한 자체적인 기능과 최적화된 메커니즘을 제공함.

MySQL에서의 트랜잭션

MySQL은 트랜잭션을 지원하는 다양한 스토리지 엔진을 제공하며, 대표적으로 InnoDB 엔진이 트랜잭션을 지원함. InnoDB는 MySQL에서 가장 널리 사용되는 트랜잭션 지원 스토리지 엔진임.

트랜잭션 명령어

  1. 트랜잭션 시작:

    START TRANSACTION;
  2. 작업 수행:

    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
  3. 트랜잭션 커밋 (변경 사항 저장):

    COMMIT;
  4. 트랜잭션 롤백 (변경 사항 취소):

    ROLLBACK;

예제

이 예제는 두 계좌 간의 송금을 수행하며, 중간에 오류가 발생하면 트랜잭션을 롤백하여 변경 사항을 취소함.

데이터베이스 설정

CREATE DATABASE bank;
USE bank;

CREATE TABLE accounts (
    account_id INT PRIMARY KEY,
    balance DECIMAL(10, 2)
);

INSERT INTO accounts (account_id, balance) VALUES (1, 1000.00); -- 계좌 A
INSERT INTO accounts (account_id, balance) VALUES (2, 500.00);  -- 계좌 B

트랜잭션 예제

START TRANSACTION;

-- 계좌 A에서 100 출금
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- 계좌 B에 100 입금
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- 커밋하여 변경 사항을 저장
COMMIT;

오류가 발생한 경우의 롤백 예제

START TRANSACTION;

-- 계좌 A에서 100 출금
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- 일부러 오류 발생
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2 AND account_id = 3; -- 잘못된 WHERE 절

-- 오류가 발생하면 롤백
ROLLBACK;

트랜잭션의 ACID 속성

트랜잭션은 다음의 ACID 속성을 만족해야 함:

  1. 원자성 (Atomicity): 트랜잭션의 모든 작업이 완전하게 실행되거나 전혀 실행되지 않아야 함.
  2. 일관성 (Consistency): 트랜잭션이 성공적으로 완료되면 데이터베이스는 일관된 상태를 유지해야 함.
  3. 격리성 (Isolation): 동시에 실행되는 트랜잭션들이 서로 간섭하지 않아야 함.
  4. 지속성 (Durability): 트랜잭션이 커밋되면 그 결과는 영구적으로 저장되어야 함.

결론

트랜잭션은 데이터베이스의 중요한 개념으로, 데이터의 일관성과 무결성을 보장함. MySQL을 비롯한 대부분의 SQL 데이터베이스 엔진은 트랜잭션을 지원하며, 이를 통해 복잡한 데이터베이스 작업을 안전하게 처리할 수 있음. 트랜잭션을 사용하면 오류 발생 시 롤백을 통해 데이터베이스 상태를 원래대로 되돌릴 수 있으며, 모든 작업이 성공적으로 완료될 때만 변경 사항을 커밋하여 저장함.

Mysql 에 대한 좀더 자세한 개념이나 원리는 real mysql 8.0을 정리하면서 좀더 자세히 다뤄볼 예정.

'SQL' 카테고리의 다른 글

MYSQL 트랜잭션의 4대 원칙  (0) 2024.07.25
Mysql 도커 실행 및 유저 설정  (0) 2024.07.08