MYSQL

MySQL 트랜잭션 관리

0hee 2024. 6. 25. 12:06

MySQL 트랜잭션 관리는 데이터베이스에서 일련의 작업들을 하나의 단위로 처리하여 데이터의 일관성과 무결성을 유지하는 방법입니다. 트랜잭션은 데이터베이스가 일관된 상태를 유지할 수 있도록 여러 작업이 모두 성공하거나 모두 실패하도록 합니다. 트랜잭션 관리의 주요 개념과 이를 PHP에서 구현하는 방법을 설명드리겠습니다.

### 주요 개념

1. **ACID 특성**:
   - **Atomicity (원자성)**: 트랜잭션 내의 모든 작업이 모두 성공하거나 모두 실패해야 합니다.
   - **Consistency (일관성)**: 트랜잭션이 완료되면 데이터베이스는 일관된 상태를 유지해야 합니다.
   - **Isolation (격리성)**: 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리되어야 합니다.
   - **Durability (지속성)**: 트랜잭션이 완료되면 그 결과는 영구적으로 데이터베이스에 저장되어야 합니다.

2. **트랜잭션의 주요 단계**:
   - **시작**: 트랜잭션을 시작합니다.
   - **커밋 (Commit)**: 트랜잭션 내의 모든 작업을 데이터베이스에 영구적으로 반영합니다.
   - **롤백 (Rollback)**: 트랜잭션 내의 모든 작업을 취소하고 데이터베이스를 트랜잭션 시작 전 상태로 되돌립니다.

### PHP에서 MySQL 트랜잭션 관리

#### 1. `mysqli`를 이용한 트랜잭션 관리

```php
$mysqli = new mysqli("localhost", "username", "password", "database");

if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
}

// 트랜잭션 시작
$mysqli->begin_transaction();

try {
    // 첫 번째 쿼리
    $mysqli->query("INSERT INTO accounts (name, balance) VALUES ('John', 1000)");

    // 두 번째 쿼리
    $mysqli->query("INSERT INTO transactions (account_name, amount) VALUES ('John', -100)");

    // 모든 쿼리가 성공하면 커밋
    $mysqli->commit();
    echo "Transaction completed successfully";
} catch (Exception $e) {
    // 오류 발생 시 롤백
    $mysqli->rollback();
    echo "Transaction failed: " . $e->getMessage();
}

$mysqli->close();
```

#### 2. `PDO`를 이용한 트랜잭션 관리

```php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 트랜잭션 시작
    $pdo->beginTransaction();

    // 첫 번째 쿼리
    $stmt1 = $pdo->prepare("INSERT INTO accounts (name, balance) VALUES (:name, :balance)");
    $stmt1->execute([':name' => 'John', ':balance' => 1000]);

    // 두 번째 쿼리
    $stmt2 = $pdo->prepare("INSERT INTO transactions (account_name, amount) VALUES (:name, :amount)");
    $stmt2->execute([':name' => 'John', ':amount' => -100]);

    // 모든 쿼리가 성공하면 커밋
    $pdo->commit();
    echo "Transaction completed successfully";
} catch (Exception $e) {
    // 오류 발생 시 롤백
    $pdo->rollBack();
    echo "Transaction failed: " . $e->getMessage();
}

$pdo = null;
```

### 트랜잭션 관리의 이점

1. **데이터 무결성 보장**: 트랜잭션은 일련의 작업이 모두 성공하거나 모두 실패하도록 하여 데이터의 무결성을 유지합니다.
2. **에러 처리 용이**: 중간에 에러가 발생하면 트랜잭션을 롤백하여 데이터베이스를 일관된 상태로 유지할 수 있습니다.
3. **복잡한 연산 관리**: 여러 테이블에 걸친 복잡한 연산을 하나의 트랜잭션으로 관리하여 데이터의 일관성을 보장합니다.

MySQL 트랜잭션 관리는 중요한 데이터베이스 연산에서 데이터의 일관성과 무결성을 유지하는 데 필수적인 도구입니다. 이를 적절히 활용하여 안전하고 신뢰할 수 있는 애플리케이션을 개발할 수 있습니다.