1. トランザクションとは
トランザクションは、4 つの ACID 特性を持つ 1 つ以上のデータベース操作ステートメントの組み合わせです:
原子性
すべてが成功するか、すべてが取り消されます。
Consistency (整合性)
データベースの状態が正しく変更された後は、データベースの整合性制約に違反しません。
分離
トランザクションは互いに独立しており、互いに干渉しません。
耐久性
トランザクションの送信結果はデータベースに永続化されます。
2. トランザクションの同時実行によって引き起こされる問題
トランザクションの分離がない場合、次のような問題が発生する可能性があります:
ダーティリード
ダーティリードとは、トランザクションがデータを読み取ってデータを変更することを意味します。作成されましたが、まだ送信されていません。この時点では、別のトランザクションもこのデータを読み取り、このデータを使用しました。たとえば、ユーザーのアカウント金額が 100 で、T1 はそれを 200 に変更しますが、それを送信しません。同時に、T2 はユーザーのアカウント金額が 200 であることを読み取り、T1 が異常にロールバックし、200 が T2 によって読み取られます。ダーティデータです。
Non-repeatable read
Non-repeatable readとは、データベース内の特定のデータがトランザクション内で複数回クエリされるが、異なる値が返されることを意味します。これは、それが変更され、コミットされたためです。クエリ間隔中の別のトランザクション。
ファントム読み取り
トランザクションの 2 つのクエリのデータ行の数が一致していません。たとえば、あるトランザクションが複数のデータ列をクエリし、別のトランザクションがこの時点でいくつかの新しいデータ列を挿入すると、最初のトランザクションは、あたかも以前には存在しなかったデータの列がいくつかあることを検出します。それは幻想だった、これは幻の読書が起こっているのだ。
3. トランザクション分離レベル
トランザクション分離レベルはどのような同時実行の問題を解決しますか? 他にどのような同時実行の問題がありますか?
1. Read Uncommitted (コミットされていないコンテンツの読み取り)
これは、トランザクションの最も低い分離レベルであり、別のトランザクションがこのトランザクションのコミットされていないデータを参照できるようになります。同時実行で発生する問題は避けられません。
2. Read Committed (送信コンテンツの読み取り)
は、あるトランザクションによって変更されたデータは、送信後に別のトランザクションによってのみ読み取ることができるようにします。つまり、別のトランザクションはトランザクションのコミットされていないデータを読み取ることができません。 。ダーティ リードは回避できますが、反復不可能な読み取りやファントム リードが発生する可能性があります。
3. 反復読み取り (再読み取り可能)
これは、データを同時に読み取るときに、同じトランザクションの複数のインスタンスが同じデータを参照できるようにする MySQL のデフォルトのトランザクション分離レベルです。ダーティ リードと非反復読み取りは回避できますが、ファントム リードが発生する可能性があります。
4. シリアル化可能
これは、トランザクションを強制的に順序付けし、相互に競合することを不可能にします。このレベルでは、多数のタイムアウトやロック競合が発生する可能性があります。ダーティリード、ノンリピータブルリード、ファントムリードの発生を回避できます。
次の記事では、InnoDB エンジンのロック メカニズムを紹介します。
上記は MySQL トランザクション、ロック、アプリケーション (1) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。