
PDO::beginTransaction 메서드는 데이터베이스 트랜잭션을 시작할 때 사용됩니다. 트랜잭션은 데이터베이스에 변경을 수행한 후, 변경이 원치 않는 경우에 revert를 하기 위해 사용됩니다.
트랜잭션을 시작한 이후에 INSERT, UPDATE, DELETE 쿼리를 수행할 때, 트랜잭션이 롤백되면 데이터베이스에 변경된 내용이 모두 삭제되는 것은 정상적인 동작입니다.
하지만, 만약 INSERT 쿼리만 수행하고 UPDATE 쿼리를 수행하지 않았을 때, 트랜잭션이 롤백되면 INSERT 쿼리만 롤백되어야 하는데, INSERT 쿼리도 롤백되지 않고 데이터베이스에 남아있는 것은 트랜잭션의 특성에 의해 발생하는 현상입니다.
이유는 PDO::beginTransaction 메서드는 데이터베이스의 모든 변경을 트랜잭션으로 묶어버리기 때문에, 트랜잭션을 롤백하면 데이터베이스에 변경된 모든 내용이 삭제됩니다.
따라서, INSERT 쿼리만 수행하고 UPDATE 쿼리를 수행하지 않았을 때, 트랜잭션이 롤백되면 INSERT 쿼리도 롤백되지 않고 데이터베이스에 남아있는 것은 PDO::beginTransaction 메서드의 특성에 의해 발생하는 현상입니다.
이 현상을 해결하기 위해서는, INSERT 쿼리와 UPDATE 쿼리를 분리하여 트랜잭션을 시작하고, 트랜잭션을 롤백할 때, INSERT 쿼리만 롤백하도록 해야 합니다.
예를 들어, 다음과 같이 INSERT 쿼리와 UPDATE 쿼리를 분리하여 트랜잭션을 시작하고, 트랜잭션을 롤백할 때, INSERT 쿼리만 롤백할 수 있습니다.
#hostingforum.kr
php
$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'username', 'password');
$pdo->beginTransaction();
// INSERT 쿼리
$stmt = $pdo->prepare('INSERT INTO mytable (name, age) VALUES (:name, :age)');
$stmt->execute([':name' => 'John', ':age' => 30]);
// UPDATE 쿼리
$stmt = $pdo->prepare('UPDATE mytable SET age = :age WHERE name = :name');
$stmt->execute([':age' => 31, ':name' => 'John']);
// 트랜잭션 롤백
$pdo->rollBack();
// INSERT 쿼리 롤백
$pdo->rollBack();
위 예제에서, INSERT 쿼리와 UPDATE 쿼리를 분리하여 트랜잭션을 시작하고, 트랜잭션을 롤백할 때, INSERT 쿼리만 롤백하도록 하였습니다.
2025-03-11 08:45