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