當前位置: 首頁> 最新文章列表> 如何使用PDOStatement::rowCount 配合事務回滾防止數據丟失

如何使用PDOStatement::rowCount 配合事務回滾防止數據丟失

gitbox 2025-05-19

在進行數據庫操作時,數據丟失是開發者最頭疼的問題之一。無論是用戶資料更新、庫存扣減,還是訂單狀態修改,一旦數據庫操作未成功執行卻未被檢測並處理,都可能導致嚴重後果。

本文將講解如何結合使用PDOStatement::rowCount()和數據庫事務回滾機制,在PHP 中有效防止這種情況的發生。

1. 什麼是rowCount()

PDOStatement::rowCount()是PDO 中用於返回上一條DELETEINSERTUPDATE語句所影響的行數的函數。它能幫助我們判斷操作是否真正對數據庫產生了影響。

需要注意的是,並非所有數據庫驅動都支持對SELECT操作調用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. 小貼士

  • 永遠不要假設UPDATEDELETE操作一定會成功;

  • 使用事務時務必處理異常,確保回滾;

  • 對於多個依賴性強的操作,務必包裹在一個事務中;

  • rowCount()返回0 並不一定意味著失敗,有時是值未變。但在嚴謹的數據場景中,正是我們想要防範的“無效寫入”。

結語

通過結合PDOStatement::rowCount()和事務控制機制,開發者可以更精準地判斷數據庫操作是否真正生效,從而在必要時進行事務回滾,防止“看起來成功、實際上失敗”的數據問題。這是高可靠系統開發中不可或缺的一項技巧。

你是否在項目中也遇到過類似的問題?歡迎留言分享你的經驗!