トランザクションは、1 つ以上の SQL ステートメントを 1 つの単位として構成されます。このユニット内の各 SQL ステートメントは相互依存しており、ユニット全体は分割できません。ユニット内のステートメントが正常に完了できない場合、ユニット全体がロールバックされ、影響を受けるすべてのデータがトランザクション開始前の状態に戻されます。したがって、トランザクション内のすべてのステートメントが正常に実行された場合にのみ、トランザクションは正常に実行されたと言えます。
トランザクションの 4 つの特徴:
原子性、各トランザクションは分割できない単位と見なされなければなりません。
一貫性 (一貫性) は、トランザクションが完全に成功したか、途中で失敗したかに関係なく、トランザクションによってシステムが一貫した状態になるときに一貫性が存在します。
分離 (Isolation) では、各トランザクションはシステム内で発生する他のトランザクションから隔離された独自の空間で発生し、トランザクションの結果は完全に実行された場合にのみ確認できます。
耐久性。システムがクラッシュしても、コミットされたトランザクションは持続します。
トランザクションを初期化し、後続のすべての SQL ステートメントをユニットとして考慮する必要があることを MySQL に伝えるために、MySQL はトランザクションの開始をマークする starttransaction コマンドを提供します。 begin または begin work コマンドを使用してトランザクションを初期化することもできます。通常、トランザクション開始コマンドの後には、トランザクションを構成する SQL ステートメントが続きます。
SQL ステートメントが実行されたら、commit コマンドを使用してトランザクション全体をディスクに保存するか、rollback コマンドを使用してすべての変更を元に戻すことができます。 トランザクションにトランザクション テーブルと非トランザクション テーブルへの変更が含まれている場合、ロールバック コマンドを使用して非トランザクション テーブルのトランザクション処理部分を元に戻すことはできません。この場合、MySQL は不完全な取り消しが行われたことを示すエラーを返します。
commit コマンドはトランザクション ブロックの終了をマークします。
MySQL は、トランザクション動作を制御するための 2 つの変数、自動コミット変数とトランザクション分離レベル変数を提供します。
自動送信: デフォルトでは、MySQL の SQL クエリは実行されると自動的に結果をデータベースに送信します。このデフォルトの動作は、特定の autocommit 変数を通じて変更できます。 autocommit=0 に設定すると、commit コマンドが明示的に発行されるまで、後続のテーブル更新は保存されません。
トランザクション分離レベル。MySQL のデフォルトは反復読み取り分離レベルであり、set を使用して変更できます。
トランザクションをサポートするデータベースは、非トランザクション データベースよりも異なるユーザーを互いに分離しておくのが難しいため、これは当然システムのパフォーマンスを反映します。
トランザクションがシステムに過度の負担をかけないようにするために何かをする必要があります。
小規模トランザクションの 2 つの一般的な戦略を使用します。
1: トランザクション開始コマンドを発行する前に、必要なユーザー入力がすべて実行可能であることを確認します。
2: 大きなトランザクションを小さなトランザクションに分割し、個別に実行するようにしてください。
適切な分離レベルを選択します。分離レベルが高いほど、パフォーマンスが低下します。したがって、トランザクション環境で 2 つ以上のシーケンスが存在する場合、デッドロックを回避できます。顧客が同じデータを同時に更新したい場合、デッドロックが発生するため、デッドロックを回避する必要があります。
以上がMySQL の高度なドリフトについての深い理解 (5)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。