Maison  >  Article  >  développement back-end  >  Connexions avancées aux bases de données PHP : transactions, verrous et contrôle de concurrence

Connexions avancées aux bases de données PHP : transactions, verrous et contrôle de concurrence

WBOY
WBOYoriginal
2024-06-01 11:43:56326parcourir

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.

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

Connexion avancée à la base de données PHP : transactions, verrous et contrôle de concurrence

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.

Transactions

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 提供了以下隔离级别:

  • 读未提交 (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

Les verrous sont utilisés pour empêcher les transactions d'accéder simultanément aux mêmes données de base de données. Le PDO de PHP propose deux modes de verrouillage :

  • 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.
Pour verrouiller les lignes du tableau via la méthode 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 : 🎜
  • LECTURE UNCOMMITTED :Les transactions peuvent lire les données non validées d'autres transactions.
  • LECTURE COMMITTED : Les transactions ne peuvent lire que les données d'autres transactions validées.
  • LECTURE RÉPÉTABLE : Une transaction peut voir les données d'autres transactions validées tout au long de son cycle de vie, mais ne peut pas voir les données des transactions non validées.
  • SÉRIALISABLE : Les transactions sont exécutées en série pour éviter tout conflit de concurrence.
🎜Vous pouvez définir le niveau d'isolement via l'option 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn