데이터베이스의 트랜잭션

023·2024년 7월 3일
0

database

목록 보기
5/8
post-thumbnail

데이터베이스 트랜잭션(Transaction)

데이터베이스 트랜잭션(Transaction)은 데이터베이스 관리 시스템(DBMS)에서 하나의 논리적 작업 단위를 구성하는 일련의 연산들을 의미한다. 트랜잭션은 데이터의 일관성과 무결성을 보장하기 위해 반드시 한 번에 완전히 수행되거나 전혀 수행되지 않아야 한다. 트랜잭션의 주요 특징을 나타내는 속성은 ACID(Atomicity, Consistency, Isolation, Durability)로 요약된다.

트랜잭션의 ACID 속성

  1. Atomicity(원자성)

    트랜잭션은 모두 성공적으로 완료되거나, 모두 취소되어야 한다. 트랜잭션 중 일부만 수행되고 나머지가 실패하는 경우는 허용되지 않는다. 즉, 트랜잭션 내의 모든 연산은 하나의 단위로 처리된다.

  2. Consistency(일관성)

    트랜잭션이 성공적으로 완료되면 데이터베이스는 일관성 있는 상태를 유지해야 한다. 트랜잭션 전후의 데이터베이스 상태는 항상 일관성을 가져야 한다.

  3. Isolation(고립성)

    동시에 여러 트랜잭션이 수행될 때, 각 트랜잭션은 다른 트랜잭션의 영향을 받지 않고 독립적으로 수행되어야 한다. 트랜잭션 중간에 다른 트랜잭션이 참조할 수 없도록 보장한다.

  4. Durability(영속성)

    트랜잭션이 완료된 후에는 시스템 장애가 발생하더라도 그 결과가 데이터베이스에 영구적으로 반영되어야 한다.

트랜잭션의 상태

트랜잭션은 다음과 같은 상태를 가진다:

  1. Active(활동 상태): 트랜잭션이 시작되고 연산이 실행 중인 상태
  2. Partially Committed(부분 완료 상태): 트랜잭션의 최종 연산이 실행된 상태
  3. Committed(완료 상태): 트랜잭션이 성공적으로 완료되어 데이터베이스에 반영된 상태
  4. Failed(실패 상태): 트랜잭션이 실패하여 중단된 상태
  5. Aborted(철회 상태): 트랜잭션이 실패하여 모든 변경 사항이 취소된 상태

트랜잭션의 예제

다음은 자바에서 JDBC를 사용하여 트랜잭션을 수행하는 예제이다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TransactionExample {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String user = "root";
        String password = "password";

        Connection conn = null;

        try {
            conn = DriverManager.getConnection(url, user, password);
            conn.setAutoCommit(false); // 트랜잭션 시작

            String sql1 = "INSERT INTO Accounts (AccountID, Balance) VALUES (?, ?)";
            String sql2 = "UPDATE Accounts SET Balance = Balance - ? WHERE AccountID = ?";

            PreparedStatement pstmt1 = conn.prepareStatement(sql1);
            PreparedStatement pstmt2 = conn.prepareStatement(sql2);

            // 첫 번째 계좌 생성
            pstmt1.setInt(1, 1);
            pstmt1.setDouble(2, 1000.0);
            pstmt1.executeUpdate();

            // 두 번째 계좌에서 금액 인출
            pstmt2.setDouble(1, 200.0);
            pstmt2.setInt(2, 1);
            pstmt2.executeUpdate();

            conn.commit(); // 트랜잭션 커밋
        } catch (SQLException e) {
            if (conn != null) {
                try {
                    conn.rollback(); // 트랜잭션 롤백
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.setAutoCommit(true);
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

트랜잭션의 활용

  1. 데이터 일관성 유지: 은행 계좌 이체, 재고 관리 등 일관성이 중요한 시스템에서 데이터의 무결성을 보장한다.
  2. 장애 복구: 시스템 장애가 발생했을 때 트랜잭션 로그를 사용하여 장애 이전의 상태로 복구할 수 있다.
  3. 동시성 제어: 다수의 사용자나 시스템이 동시에 데이터베이스에 접근할 때, 트랜잭션을 통해 데이터의 일관성을 유지한다.

트랜잭션의 격리 수준

트랜잭션의 격리 수준은 동시에 실행되는 트랜잭션들이 서로 간섭하지 않도록 하는 정도를 정의한다. 격리 수준은 다음과 같다:

  1. Read Uncommitted: 가장 낮은 격리 수준으로, 다른 트랜잭션이 아직 커밋되지 않은 데이터를 읽을 수 있다.
  2. Read Committed: 다른 트랜잭션이 커밋한 데이터만 읽을 수 있다.
  3. Repeatable Read: 동일한 트랜잭션 내에서 동일한 데이터를 여러 번 읽어도 항상 같은 결과를 보장한다.
  4. Serializable: 가장 높은 격리 수준으로, 트랜잭션을 직렬화하여 실행하므로 완벽한 격리를 보장한다.

격리 수준 설정 예제

MySQL에서 격리 수준을 설정하는 예제이다.

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;

-- 트랜잭션 작업 수행

COMMIT;

결론

트랜잭션은 데이터베이스의 일관성과 무결성을 유지하기 위해 필수적인 개념이다. ACID 속성을 통해 트랜잭션의 안정성을 보장하며, 적절한 격리 수준을 설정하여 동시성 문제를 해결할 수 있다. 이를 통해 데이터베이스 시스템은 신뢰성과 안정성을 제공하며, 복잡한 작업을 안전하게 수행할 수 있게 된다.

profile
Get your hands dirty

0개의 댓글