본문 바로가기
PHP

[PHP] PDO를 이용한 데이터베이스 트랜잭션 처리

by teamnova 2024. 7. 31.
728x90

안녕하세요. 오늘은 PDO를 이용해 PHP에서 데이터베이스 트랜잭션 처리를 어떻게 하는지 알아보겠습니다.

 

트랜잭션은 데이터베이스 작업을 일관되게 처리하도록 하는 도구입니다. 여러 번의 SQL 작업이 필요한 경우, 트랜잭션을 사용하여 여러 작업중 하나라도 실패한다면 전체 작업이 취소되도록 할 수 있습니다.

 

예를 들어, 쇼핑몰에서 유저가 상품을 구매했다고 가정해봅시다.

 

[A] 구매내역을 데이터베이스에 저장

[B] 마일리지를 유저에게 적립

 

이 경우, A를 수행하는 동안 오류가 발생했는데 B가 정상적으로 작동하여 마일리지를 적립하는 것은 문제가 있습니다. 반대로, A는 정상적으로 작동했지만 B에서 오류가 발생해도 안 됩니다.

트랜잭션 처리를 하면 A, B 두 작업 중 하나라도 오류가 발생하면 전체 작업이 취소됩니다.

 

전체 코드입니다. 데이터베이스는 MySQL을 사용한다고 가정하겠습니다.

<?php
try {
$pdo = new PDO('mysql:host=your_host;dbname=your_db', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

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

// 1. 구매내역을 데이터베이스에 저장
$stmt1 = $pdo->prepare("INSERT INTO purchase_history (user_id, product_id, purchase_date) VALUES (:user_id, :product_id, :purchase_date)");
$stmt1->execute([
':user_id' => 1,
':product_id' => 101,
':purchase_date' => date('Y-m-d H:i:s')
]);

// 2. 마일리지를 유저에게 적립
$stmt2 = $pdo->prepare("UPDATE users SET mileage = mileage + :mileage WHERE user_id = :user_id");
$stmt2->execute([
':mileage' => 100,
':user_id' => 1
]);

// 트랜잭션 커밋.
$pdo->commit();
echo "트랜잭션이 성공적으로 커밋되었습니다.";

} catch (Exception $e) {
// 예외가 발생할 시 rollBack 처리.
$pdo->rollBack();
echo "트랜잭션 실패: " . $e->getMessage();
}
?>

 

 

여기서 beginTransaction(); 메소드를 이용하면,

이 시점부터 실행되는 모든 SQL 명령이 트랜잭션에 포함되게 됩니다.

 

이후 commit(); 메소드를 실행하여 모든 SQL 명령을 적용시킵니다.

 

예외가 발생했을때

rollBack(); 메소드를 사용하여 모든 변경사항을 취소합니다.

 

 

여기까지 PHP와 PDO를 이용해 데이터베이스 트랜잭션 처리 하는 법을 알아보았습니다. 감사합니다.