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