현재 위치: > 최신 기사 목록> pdostatement :: RowCount를 사용하여 데이터 손실을 방지하기 위해 트랜잭션 롤백과 협력하는 방법

pdostatement :: RowCount를 사용하여 데이터 손실을 방지하기 위해 트랜잭션 롤백과 협력하는 방법

gitbox 2025-05-19

데이터 손실은 데이터베이스 작업을 수행 할 때 개발자에게 가장 번거로운 문제 중 하나입니다. 데이터베이스 작업이 성공적으로 실행되지 않지만 감지 및 처리되지 않으면 사용자 데이터 업데이트, 재고 공제 또는 주문 상태 수정이든 심각한 결과를 초래할 수 있습니다.

이 기사는 PDOSTATEMENT :: ROWCOUNT () 및 데이터베이스 트랜잭션 롤백 메커니즘을 사용하여 PHP의 이러한 상황을 효과적으로 방지하는 방법을 설명합니다.

1. RowCount () 란 무엇입니까?

pdostatement :: rowCount () 는 PDO의 기능으로, 이전 삭제 , 삽입 또는 업데이트 문의 영향을받는 행 수를 반환합니다. 운영이 실제로 데이터베이스에 영향을 미쳤는지 여부를 결정하는 데 도움이 될 수 있습니다.

모든 데이터베이스 드라이버가 선택 작업에 ​​대해 rowCount () 호출을 지원하는 것은 아니며, 데이터가 성공적으로 업데이트되었는지 여부를 감지하는 데 사용됩니다.

2. 거래와 함께 사용하는 이유는 무엇입니까?

여러 관련 데이터베이스 작업을 수행 할 때 단계 중 하나가 성공하지 못한 경우 데이터 불일치를 피하기 위해 이전 변경 사항을 롤백해야합니다. 예를 들어, 사용자의 이메일 주소를 업데이트하려고하지만 레코드가 실제로 수정되지 않았으며 프로그램이 계속해서 후속 작업을 수행하면 논리적 혼란이나 데이터 손실로 이어질 수 있습니다.

현재 트랜잭션과 RowCount ()를 조합하여 사용하는 것이 특히 중요합니다.

3. 예 : 사용자 정보 업데이트의 트랜잭션 제어

다음은 데이터 보안을 보장하기 위해 사용자 정보를 업데이트 할 때 RowCount ()를 사용하는 방법을 보여주는 방법을 보여줍니다.

 <?php
$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8mb4';
$user = 'db_user';
$password = 'db_pass';

try {
    $pdo = new PDO($dsn, $user, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);

    // 사용자의 사서함을 업데이트하고 싶다고 가정 해 봅시다
    $userId = 123;
    $newEmail = '[email protected]';

    $pdo->beginTransaction();

    $stmt = $pdo->prepare("UPDATE users SET email = :email WHERE id = :id");
    $stmt->execute([
        ':email' => $newEmail,
        ':id' => $userId
    ]);

    // 사용 rowCount 데이터가 업데이트되었는지 여부를 결정하십시오
    if ($stmt->rowCount() === 0) {
        // 기록이 업데이트되지 않았습니다,트랜잭션을 롤백하십시오
        $pdo->rollBack();
        echo "업데이트가 실패했습니다,일치하는 사용자가 없습니다,거래가 롤백되었습니다。";
    } else {
        // 성공적으로 업데이트하십시오,거래를 제출하십시오
        $pdo->commit();
        echo "邮箱성공적으로 업데이트하십시오,거래가 제출되었습니다。";
    }

} catch (PDOException $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    echo "데이터베이스 작업이 실패했습니다:" . $e->getMessage();
}
?>

설명 :

  • 트랜잭션을 시작하려면 begintransaction ()을 사용하십시오.

  • execute ()는 업데이트를 실행합니다.

  • RowCount ()를 사용하여 레코드가 실제로 업데이트되었는지 여부를 결정하십시오.

  • 기록이 업데이트되지 않으면 거래는 즉시 롤백됩니다.

  • 그렇지 않으면 안전하게 제출하십시오.

4. 응용 시나리오 확장

이 방법은 업데이트 작업에 적합 할뿐만 아니라 인벤토리 시스템, 포인트 공제, 결제 처리 및 기타 시나리오에서 매우 실용적입니다. 예를 들어:

  • 공제가 실패하면 주문 상태를 롤백하십시오.

  • 업데이트 사용자 균형이 실패한 경우 지불 기록 삽입;

  • 롤백 로그 쓰기 작업 사용자를 삭제할 때 실패합니다.

5. 팁

  • 업데이트 또는 삭제 작업이 성공할 것이라고 가정하지 마십시오.

  • 트랜잭션을 사용할 때 예외를 처리하여 롤백을 보장하십시오.

  • 다수의 종속적 인 운영의 경우 하나의 거래를 랩핑해야합니다.

  • RowCount () 반환 0이 반드시 실패를 의미하는 것은 아니며 때로는 값이 변경되지 않은 상태로 유지됩니다. 그러나 엄격한 데이터 시나리오에서는 우리가 예방하고자하는 "유효하지 않은 쓰기"입니다.

결론

PDOSTATEMENT :: ROWCOUNT () 과 트랜잭션 제어 메커니즘을 결합함으로써 개발자는 데이터베이스 작동이 실제로 적용되는지 여부를보다 정확하게 결정하여 필요할 때 트랜잭션 롤백을 수행하여 "성공적이지만 실제로 실패한"데이터 문제를 방지 할 수 있습니다. 이것은 고 신뢰성 시스템의 개발에 없어서는 안될 기술입니다.

프로젝트에서 비슷한 문제를 겪었습니까? 경험을 공유하기 위해 메시지를 남겨 주시기 바랍니다!