MySQLトランザクションとロック

2372 ワード

トランザクションの独立性レベル
SQL規格で定義された4つの独立性レベルは次のとおりです.
  • READ UNCOMMITED(コミットされていない読み取り)トランザクションでの修正は、コミットされていなくても他のトランザクションに対して表示されます.トランザクションは、コミットされていないデータを読み出すことができ、ダーティリードとも呼ばれます.このレベルは独立性レベルの中で最も低く、実際にはほとんど使用されません.
  • READ COMMITED(コミット・リード)トランザクションは、コミットが開始されるまで、他のトランザクションに対して変更は表示されません.このレベルは、同じクエリーを2回実行すると、異なる結果が得られる可能性があるため、繰り返し不可と呼ばれることもあります(同じクエリーの間に他のトランザクションが変更をコミットする可能性があります). MySQL
  • REPEATABLE READ(繰り返し読み取り可能)このトランザクション境界は、汚れた読み取りの問題を解決し、同じトランザクションで同じレコードを複数回読み出す結果が一致することを保証します(データスナップショットを介して). MySQL しかし、理論的には、繰り返し読み取り可能分離レベルは、別の幻読み取りの問題を解決することができない.幻読みとは、現在あるトランザクションがある範囲のレコードを読み込んでいる間に、別のトランザクションがその範囲に新しいレコードを挿入し、前のトランザクションがその範囲のレコードを再び読み込んだときに幻行(新しいデータ行を読み出す)が発生することを意味します.MySQL InnoDBストレージエンジンは、マルチバージョン兵法制御(MVCC)によって幻読の問題を解決した.基本原理は、各行のレコードの後に2つの非表示の列を保存することによって実現され、1つの保存行の作成時間、もう1つの保存行の有効期限(または削除時間)です.もちろん、実際の時間値ではなく、システムバージョン番号が格納されます.トランザクションを開始するたびに、システムのバージョン番号が自動的に増加します.トランザクションの開始時刻のシステム・バージョン番号は、クエリーされた各行に記録されたバージョン番号と比較するためにトランザクションのバージョン番号として使用されます.詳細については、「高性能MySQL」の1.4バージョン以上の同時制御章を参照してください.
  • SERIALIZABLE(シリアル化可能)で最も高いトランザクション独立性レベルは、トランザクションのシリアル実行を強制することによって、前の幻読みの問題を回避します.簡単に言えば、トランザクションは読み出した各ローのデータにロックをかけるため、大量のタイムアウトとロック競合の問題を引き起こす可能性があります.実際の応用では,この分離境界はあまり用いられない.

  • MySQLのトランザクション
    MySQLのデフォルトはオートコミット(AUTOMMIT)モードです.すなわち、トランザクションが表示されずに開始された場合、各クエリはトランザクションとしてコミットされます.
    MySQLロック
    MySQLのロックは共有ロック(shared lock)と排他ロック(exclusive lock)に分けられ、リードロック(read lock)とライトロック(write lock)とも呼ばれます.リード・ロックが共有されているか、排他的であるか、すなわち、1つのライト・ロックが他のライト・ロックとリード・ロックをブロックするのは、セキュリティ・ポリシーの考慮からであり、このようにしてこそ、所定の時間に1人のユーザだけが書き込みを実行し、他のユーザが書き込み中の同じリソースを読み取ることを防止することができる.InnoDBは、トランザクションの実行中に自動的にロックされ、COMMITまたはROLLBACKが実行されたときに解放され、すべてのロックは同じ時刻に解放されます.ここで説明するロックはすべて暗黙的なロックであり、InnoDBは暗黙的なロックに加えて特定の文による表示ロックをサポートする.
  • 共有ロックを追加:SELECT...LOCK IN SHARE MODE
  • 追加排他錠:SELECT...FOR UPDATE

  • MySQLトランザクションとロックの適用
    今、1つの画像の配布機能を実現する必要があります.1枚の画像は2人にしか配布できません.どのように実現すれば、画像のオーバーヘアが発生しないことができますか?
    この問題は、パフォーマンスを考慮せずにMySQLトランザクションと表示ロックで解決できます.
  • 取引開始、START TRANSACTION
  • 排他ロック方式、SELECT画像配信回数<2
  • 単純業務記録
  • 更新ピクチャ配信回数
  • 取引終了、COMMIT
  • トランザクション+表示ロックを使用すると、同じローを操作するすべてのトランザクションをシリアル化し、同時書き込みの問題を解決できます.
    最後に、より高いパフォーマンス処理を考慮すると、この問題はRedisトランザクションを使用して解決することもできます(WATCH+MULTI+EXEC)、詳細はグーグルで説明することができます.