首頁 >後端開發 >php教程 >進階 PHP 資料庫連線:交易、鎖和並發控制

進階 PHP 資料庫連線:交易、鎖和並發控制

WBOY
WBOY原創
2024-06-01 11:43:56352瀏覽

進階 PHP 資料庫連線涉及交易、鎖定和並發控制,以確保資料完整性和避免錯誤。事務是一組操作的原子單元,透過 beginTransaction()、commit() 和 rollback() 方法管理。鎖透過 PDO::LOCK_SHARED 和 PDO::LOCK_EXCLUSIVE 防止同時存取資料。並發控制透過 MySQL 隔離等級(讀未提交、讀取已提交、可重複讀取、串列化)協調多個交易的存取。實際應用中,事務、鎖和並發控制用於購物網站的產品庫存管理,確保資料完整性和避免庫存問題。

高级 PHP 数据库连接:事务、锁和并发控制

進階PHP 資料庫連線:交易、鎖定與並發控制

在使用PHP 進行資料庫互動時,了解進階概念如交易、鎖定和同時控制對於保證資料完整性和避免應用程式中的錯誤至關重要。

交易

事務是一組資料庫操作的集合,它們作為一個原子單元執行。這意味著事務中的所有操作要么全部成功,要么全部失敗。

使用beginTransaction()commit()rollback() 方法來啟動、提交和回滾交易:

$db->beginTransaction();
try {
    // 执行数据库操作
    $db->commit();
} catch (\Exception $e) {
    $db->rollback();
}

鎖定

鎖定用於防止事務同時存取相同的資料庫資料。 PHP 的 PDO 提供了兩種鎖定模式:

  • PDO::LOCK_SHARED:允許交易讀取數據,但不能寫入。
  • PDO::LOCK_EXCLUSIVE:允許交易讀取和寫入數據,但其他事務無法同時存取。

要透過query() 方法鎖定資料表行:

$stmt = $db->query('SELECT * FROM table WHERE id = 1 FOR UPDATE');

並發控制

並發控制機制確保當多個事務同時存取資料庫時不會發生資料衝突。 MySQL 提供了以下隔離等級:

  • 讀取未提交 (READ UNCOMMITTED):交易可以讀取其他交易未提交的資料。
  • 讀取已提交 (READ COMMITTED):交易只能讀取其他已提交的交易的資料。
  • 可重複讀取 (REPEATABLE READ):事務在整個生命週期內都可以看到其他已提交事務的數據,但不能看到未提交的事務的數據。
  • 串行化 (SERIALIZABLE):交易串列執行,避免任何並發衝突。

您可以在連接到資料庫時透過PDO::ATTR_DEFAULT_FETCH_MODE 選項來設定隔離等級:

$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$db->setAttribute(PDO::ATTR_TRANSACTION_ISOLATION, PDO::ISOLATION_READ_COMMITTED);

實戰案例

考慮一個線上購物網站,其中用戶可以將產品添加到購物車並進行購買。為了防止問題,如同一產品同時被多個使用者加入購物車,可以使用事務、鎖和並發控制來保證資料的完整性:

// 启动事务
$db->beginTransaction();

// 锁定产品行
$stmt = $db->query('SELECT * FROM products WHERE id = :id FOR UPDATE');
$stmt->bindParam(':id', $productId);
$stmt->execute();

// 获取产品数量
$product = $stmt->fetch();
$quantity = $product['quantity'];

// 检查库存
if ($quantity <= 0) {
    $db->rollback();
    throw new RuntimeException('Product is out of stock.');
}

// 更新库存
$quantity--;
$stmt = $db->prepare('UPDATE products SET quantity = :quantity WHERE id = :id');
$stmt->bindParam(':quantity', $quantity);
$stmt->bindParam(':id', $productId);
$stmt->execute();

// 提交事务
$db->commit();

透過使用事務、鎖和並發控制,我們可以確保在使用者購買產品時資料庫的完整性,並避免任何庫存問題。

以上是進階 PHP 資料庫連線:交易、鎖和並發控制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn