高度な PHP データベース接続: トランザクション、ロック、同時実行制御

WBOY
リリース: 2024-06-01 11:43:56
オリジナル
328 人が閲覧しました

高度な PHP データベース接続には、データの整合性を確保し、エラーを回避するためのトランザクション、ロック、同時実行制御が含まれます。トランザクションは一連の操作の原子単位であり、beginTransaction()、commit()、および rollback() メソッドを通じて管理されます。ロックにより、PDO::LOCK_SHARED および PDO::LOCK_EXCLUSIVE を介したデータへの同時アクセスが防止されます。同時実行制御は、MySQL 分離レベル (非コミット読み取り、コミット読み取り、反復可能読み取り、シリアル化可能) を通じて複数のトランザクションへのアクセスを調整します。実際のアプリケーションでは、トランザクション、ロック、同時実行制御がショッピング Web サイトの製品在庫管理に使用され、データの整合性を確保し、在庫の問題を回避します。

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

高度な PHP データベース接続: トランザクション、ロック、同時実行制御

PHP を使用してデータベースと対話する場合、データの整合性を確保し、アプリケーションでのエラーを回避するために、トランザクション、ロック、同時実行制御などの高度な概念を理解することが重要です。

トランザクション

トランザクションは、アトミック単位として実行されるデータベース操作のコレクションです。これは、トランザクション内のすべての操作がすべて成功するかすべて失敗することを意味します。

beginTransaction()commit()、および rollback() メソッドを使用して、トランザクションを開始、コミット、ロールバックします: 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);
ログイン後にコピー

Lock

ロックは、トランザクションが同時に同じデータベース データにアクセスすることを防ぐために使用されます。 PHP の PDO は 2 つのロック モードを提供します:

  • PDO::LOCK_SHARED: トランザクションによるデータの読み取りは許可されますが、書き込みは許可されません。
  • PDO::LOCK_EXCLUSIVE: トランザクションはデータの読み取りと書き込みを許可されますが、他のトランザクションが同時にデータにアクセスすることはできません。

query() メソッドを通じてテーブルの行をロックするには:

// 启动事务
$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();
ログイン後にコピー
同時実行制御🎜🎜同時実行制御メカニズムにより、複数のトランザクションがデータベースにアクセスするときに同時実行制御が発生しないことが保証されます。同時にデータの競合も発生します。 MySQL は次の分離レベルを提供します: 🎜
  • READ UNCOMMITTED:トランザクションは、他のトランザクションからコミットされていないデータを読み取ることができます。
  • READ COMMITTED: トランザクションは、他のコミットされたトランザクションからのデータのみを読み取ることができます。
  • REPEATABLE READ: トランザクションは、そのライフサイクルを通じて他のコミットされたトランザクションのデータを参照できますが、コミットされていないトランザクションのデータは参照できません。
  • シリアル化可能: 同時実行性の競合を避けるために、トランザクションはシリアルに実行されます。
🎜データベースに接続するときに、PDO::ATTR_DEFAULT_FETCH_MODE オプションを使用して分離レベルを設定できます: 🎜rrreee🎜実際的なケース🎜🎜 ユーザーが商品をカートに追加してご購入ください。複数のユーザーが同時に同じ商品をショッピング カートに追加するなどの問題を防ぐために、トランザクション、ロック、同時実行制御を使用してデータの整合性を確保できます: 🎜rrreee🎜 トランザクション、ロック、同時実行制御を使用することにより、製品を購入するときにユーザーのデータベースの整合性を確保し、在庫の問題を回避できます。 🎜

以上が高度な PHP データベース接続: トランザクション、ロック、同時実行制御の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート