データベーストランザクション内でphpアプリケーション全体を実行することの理論的および実際的な欠点は何ですか?スクリプトで発生した予期しないエラーまたは例外がデータベースで行われたすべての変更を元に戻すことを保証し、未完成のスクリプトによる状態を回避します更新されたテーブルと更新されていないテーブルがありますか? これは明らかに良い習慣として推奨されていないように見えますが、その理由を詳しく理解したいと思います。
1 に答える
データベース トランザクションは、複数の操作が ACID プロパティに従うことを保証します。
Atomic - これは、質問で言及したプロパティです。これにより、トランザクション内のすべての操作が成功するか、すべて失敗します。
Consistent - このプロパティは、データベースの状態が常に有効であることを保証します。
分離- このプロパティは、同時実行トランザクション (つまり、異なる接続から) が、あたかも連続して実行されたかのように発生することを保証します。と
耐久性- 一度コミットすると、変更は永続的です。
Isolationの 3 番目のプロパティを確保するために、MySQL などの RDBMS システムはロックを実行して、たとえば、あるトランザクションがレコードから読み取りを行っている間に別のトランザクションがレコードに書き込みを行わないようにします (レコードがロックされている場合、他のトランザクションはそのレコードを待機する必要があります)。続行する前にロックを解除する必要があります)。
トランザクションが不必要に長い場合、過度のロックと過度の待機につながります。不要なデッドロックが発生する可能性さえあります。つまり、トランザクションは相互に保持されているロックを待機しており、少なくとも 1 つがロールバックされるまで先に進むことができません。
したがって、パフォーマンス (および耐久性) の理由から、一貫性を維持するために絶対に必要なだけトランザクションを小さく保つように努める必要があります。