ホームページ  >  記事  >  バックエンド開発  >  PHPデータベーストランザクションで発生した問題の解決

PHPデータベーストランザクションで発生した問題の解決

不言
不言転載
2019-04-13 11:38:052819ブラウズ

この記事の内容は、PHP データベース トランザクションで発生する問題の解決に関するものであり、一定の参考価値があります。必要な友人は参照してください。お役に立てば幸いです。

php の PDO 拡張機能を使用するときに問題が発見されました。トランザクションを開いた後、php と mysql の間の接続が切断されると、php は警告例外を直接スローするのではなく、直接記録します。

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

try {
    // 1. 开启事务

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

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

    // 5. 记错误日志

    // 6. 抛出异常
}

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

上記の操作は単純に 5 つのカテゴリに分類できます。私の以前の理解では、例外がスローされない限り、トランザクションを操作する一般的なプロセスは上記のとおりです。トランザクションは送信されます。成功しました

しかし、ある日データベースが異常になり、トランザクションが開始されるまで、上記の 1 ~ 2 のプロセス中にデータベースが直接ハングし、その後ステップ 3 でトランザクションが送信されると、

警告
レベルのエラーが直接表示されます。"SQLSTATE[HY000]: 一般エラー: 2006 MySQL サーバーが消えました",例外はキャッチされませんしたがって、ステップ 7 のフォローアップでは、ステップ中に、その他の事業者は未提出の取引IDを取得して統計をとりましたが、実際には利用者の財産は増えませんでした。これにより問題が発生しました。
困惑したときにドキュメントを確認したところ、長い間放置されていたバグを発見しました: https://bugs.php.net/bug.php?... .

その後、トランザクションの場所で

set_error_handler

を一時的に設定することで問題を解決しました。

以上がPHPデータベーストランザクションで発生した問題の解決の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。