Maison  >  Article  >  développement back-end  >  Résoudre les problèmes rencontrés dans les transactions de base de données PHP

Résoudre les problèmes rencontrés dans les transactions de base de données PHP

不言
不言avant
2019-04-13 11:38:052842parcourir

Le contenu de cet article concerne la résolution des problèmes rencontrés dans les transactions de base de données PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Un problème découvert lors de l'utilisation de l'extension PDO de php. Après l'ouverture de la transaction, si la connexion entre php et mysql est déconnectée, php enregistrera directement une exception d'avertissement au lieu de la lancer directement. le processus de levée d'une exception

est le suivant :

/**
 * 一个用户财产变更的场景下
 */

try {
    // 1. 开启事务

    /**
     * 2. 变更用户财产,增加财产变更的流水记录
     */

    // 3. 提交事务
} catch (\Exception $e) {
    // 4. 回滚事务

    // 5. 记错误日志

    // 6. 抛出异常
}

// 7. 发布用户财产变更的广播

Les opérations ci-dessus peuvent être simplement divisées en cinq catégories. D'après ma compréhension précédente, le processus général d'exploitation des transactions est le même que ci-dessus. Il n'y a pas Si une exception est levée, la transaction est soumise avec succès
Mais jusqu'au jour où l'exception de base de données se produit, une transaction a été démarrée. Pendant le processus 1-2 ci-dessus, la base de données se bloque directement, puis la transaction est lancée. soumis à l'étape 3. Parfois, une warning erreur de niveau apparaîtra directement, "SQLSTATE[HY000]: General error: 2006 MySQL server has gone away" , aucune exception n'est détectée
, donc dans les étapes suivantes de l'étape 7, d'autres parties commerciales obtiennent l'ID de transaction non soumis et établissent des statistiques, mais dans fait La propriété de l'utilisateur n'est pas augmentée. Cela a conduit au problème

Quand j'étais perplexe, j'ai regardé la documentation et j'ai trouvé un bug qui existe depuis longtemps : https://bugs.php.net/bug.php?.. .

Plus tard, nous avons résolu le problème en configurant temporairement set_error_handler à l'emplacement de la transaction

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer