1. ACID
原子性
原子性: トランザクションは、分割できない最小の作業単位とみなされ、トランザクション全体が完全に実行されるか、失敗した場合はロールバックされます。
一貫性
一貫性: データベースは常に、ある一貫した状態から別の一貫した状態に遷移します。たとえば、出金操作が失敗した場合でも、トランザクションがコミットされていないため、トランザクションによって加えられた変更はデータベースに保存されず、データはトランザクションが実行される前の状態のままになります。トランザクションが正常に実行された場合、データは実行後も変更されません。
分離
分離: 1 つのトランザクションによって行われた変更は、コミットされるまで他のトランザクションには表示されません。
耐久性
耐久性: トランザクションがコミットされると、その変更はデータベースに永続的に保存されます。
注
ロック粒度のアップグレードによりシステムのオーバーヘッドが増加するのと同様に、トランザクション処理プロセスではデータベース システムにより多くの追加作業が必要になります。 ACID をサポートする DB は通常、ACID をサポートする必要のないデータベースよりも高い CPU 処理能力を必要とし、より多くのメモリとディスク領域を必要とします。したがって、ユーザーはさまざまなアプリケーション シナリオを通じて MySQL のさまざまなデータベース エンジンを選択し、変更に柔軟に適応できます。
2. 分離レベル
SQL 標準では 4 つの分離レベルが定義されています。トランザクション分離の各レベルは、トランザクション内およびトランザクション間でトランザクションによって行われた変更の可視性に対応します。分離レベルが低いほど同時実行性が強化され、システムのオーバーヘッドが低くなります。
コミットされていない読み取り
コミットされていない読み取り: この分離レベルのトランザクションの場合、データ変更プロセス中に、コミットされていない場合でも他のトランザクションがデータを読み取ることができます。コミットされていないデータを読み取ることができるトランザクションはダーティ読み取りとも呼ばれます。ダーティ読み取りは実際のアプリケーションで多くの問題を引き起こす可能性があるため、この分離レベルは通常はほとんど使用されません。
コミットされた読み取り
コミットされた読み取り: (一般的なデータベースのデフォルトのトランザクション レベル) 現在のトランザクションが実行され、データが送信された後にのみ、他のトランザクションはデータを読み取ることができます。他のトランザクションによって実行された 2 つの異なるクエリによって 2 つの異なる結果が生じる可能性があるため、これは非反復読み取りとも呼ばれます (トランザクションの実行前に 1 回読み取り、トランザクションの実行後に 1 回読み取り)。
反復可能読み取り
反復可能読み取り: (Mysql のデフォルトの分離レベル) このレベルは、同じトランザクション内での複数の読み取りの結果の一貫性を保証します。しかし、それでもファントム・リーディングの問題は解決できません。ファントム読み取り: トランザクション A が特定の範囲のデータを読み取ると、トランザクション B がその範囲のデータに対して挿入およびその他の更新操作を実行します。トランザクション A がその範囲内のレコードを再度読み取ると、ファントム読み取りが発生します。
シリアル化可能
シリアル化可能: データの各行を読み取るときに、ファントム読み取りの問題を回避するためにトランザクションを強制的にシリアルに実行するためにロックが追加されます。ただし、タイムアウトやロック競合の問題が発生する傾向があります。また、アプリケーションの数も比較的少ないため、このレベルは、データの一貫性と同時実行性が特に必要ない場合にのみ使用されます。
3. Mysql はトランザクション分離レベルを設定します
トランザクション分離レベルを設定します 読み取りがコミットされました
新しい分離レベルは、次のトランザクションの実行が開始されるときに有効になります。現在のトランザクションの分離レベルを変更する必要がある場合は、構成ファイルを変更できます。さらに、前回のブログでは、mysql が提供するトランザクションをサポートする 2 つのストレージ エンジン、InnoDB と NDB Cluster を紹介しました。
上記は、MySQL データベースの最適化 (2) - MySQL トランザクションの内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。