Maison >développement back-end >tutoriel php >Connexions avancées aux bases de données PHP : transactions, verrous et contrôle de concurrence
Les connexions avancées à la base de données PHP impliquent des transactions, des verrous et un contrôle de concurrence pour garantir l'intégrité des données et éviter les erreurs. Une transaction est une unité atomique d'un ensemble d'opérations, gérée via les méthodes beginTransaction(), commit() et rollback(). Les verrous empêchent l'accès simultané aux données via PDO::LOCK_SHARED et PDO::LOCK_EXCLUSIVE. Le contrôle d'accès concurrentiel coordonne l'accès à plusieurs transactions via les niveaux d'isolement MySQL (lecture non validée, lecture validée, lecture répétable, sérialisable). Dans les applications pratiques, les transactions, les verrous et le contrôle de concurrence sont utilisés pour la gestion des stocks de produits sur les sites Web commerciaux afin de garantir l'intégrité des données et d'éviter les problèmes d'inventaire.
Lors de l'interaction avec des bases de données à l'aide de PHP, la compréhension des concepts avancés tels que les transactions, les verrous et le contrôle de concurrence est cruciale pour garantir l'intégrité des données et éviter les erreurs importantes dans votre application.
Une transaction est un ensemble d'opérations de base de données exécutées comme une unité atomique. Cela signifie que toutes les opérations de la transaction réussissent toutes ou échouent toutes.
Utilisez les méthodes beginTransaction()
, commit()
et rollback()
pour démarrer, valider et annuler des transactions : 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);Lock
PDO::LOCK_SHARED
: permet aux transactions de lire des données, mais pas d'écrire. PDO::LOCK_EXCLUSIVE
: les transactions sont autorisées à lire et à écrire des données, mais d'autres transactions ne peuvent pas y accéder en même temps. 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();Contrôle de concurrence🎜🎜Le mécanisme de contrôle de concurrence garantit qu'il ne se produit pas lorsque plusieurs transactions accèdent à la base de données en même temps Conflit de données. MySQL fournit les niveaux d'isolement suivants : 🎜
PDO::ATTR_DEFAULT_FETCH_MODE
lors de la connexion à la base de données : 🎜rrreee🎜Cas pratique🎜🎜Considérez un site d'achat en ligne où les utilisateurs peuvent Ajoutez le produit au panier et achetez. Afin d'éviter des problèmes, tels que l'ajout simultané du même produit au panier par plusieurs utilisateurs, des transactions, des verrous et un contrôle de concurrence peuvent être utilisés pour garantir l'intégrité des données : 🎜rrreee🎜 En utilisant des transactions, des verrous et un contrôle de concurrence , nous pouvons garantir l'intégrité de la base de données utilisateur lors de l'achat de produits et éviter tout problème d'inventaire. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!