MySQL チューニング シリーズ (8) - トランザクションとロックの分類

1. ビジネスとは何ですか

トランザクションは、実行されるか、まったく実行されない操作の論理セットです。
SQL ステートメントは次のとおりです。

# 开启事务
START TRANSACTION;
# 多条 SQL 语句
SQL1,SQL2...
## 提交事务
COMMIT;

次に、トランザクションの特性 (ACID)

アトミック性: トランザクションは実行の最小単位であり、分割することはできません。トランザクションのアトミック性により、アクションが完全に完了するか、まったく機能しないことが保証されます (実行完了)一貫性: トランザクションの実行前後で、データの一貫性が保たれます。たとえば、送金ビジネスでは、トランザクションが成功したかどうかに関係なく、送金者と受取人の合計金額は変わらない必要があります。(データの一貫性) 分離性: ユーザーのトランザクションは他のトランザクションによって干渉されず、同時トランザクション
間のデータベースは独立しています。(相互に独立) 持続性: 実行後トランザクションがコミットますデータベース内のデータに対する変更は永続的です。(永続的な変更)

3. 同時トランザクションによって引き起こされる問題

ダーティ ライト: 同じデータ行に対して、その行に対するトランザクションの更新操作は、データ行に対する他のトランザクションの更新操作をオーバーライドします。更新損失の本質は、書き込み操作の競合です。解決策は、各トランザクションをシリアル方式で実行し、書き込み操作を特定の順序で実行することです。

ダーティ リード: 1 つのトランザクションが別のトランザクションのコミットされていないデータを読み取り、後続のトランザクションがロールバックされるため、ダーティ データが見つかります。ダーティ リードは本質的に読み取り操作と書き込み操作の間の競合であり、解決策は最初に書き込み、次に読み取りを行う、つまり書き込み後に読み取りを行うことです。

Non-repeatable read : 同じトランザクション内で、同じクエリステートメントを使用して、異なる時点で読み取られた結果データは一貫性がありません。非反復性の本質は、読み取り操作と書き込み操作の競合でもあり、解決策は、最初に読み取り、次に書き込みを行う、つまり読み取り後に書き込みを行うことです。

ファントム読み取り:トランザクションによって2回読み取られるデータ結果セットの数が異なります。ファントム読み取りは、基本的に読み取り操作と書き込み操作の間で競合します。解決策は、最初に読み取り、次に書き込みを行うこと、つまり読み取りと書き込みを行うことです。
非反復読み取りは更新と削除に重点を置き、ファントム読み取りは挿入操作に重点を置きます。

4. トランザクション分離レベル

READ-UNCOMMITTED (コミットされていない読み取り) : コミットされていないデータ変更の読み取りを許可する最も低い分離レベル。これにより、ダーティ リード、ファントム リード、または反復不可能な読み取りが発生する可能性があります。
READ-COMMITTED (コミットされた読み取り) : 同時トランザクションによってコミットされたデータを読み取ることができます。これによりダーティ リードを防ぐことができますが、ファントム リードまたは反復不可能な読み取りが発生する可能性があります。
REPEATABLE-READ (反復可能読み取り) : トランザクション自体によってデータが変更されない限り、同じフィールドの複数の読み取りの結果は一貫しています。これにより、ダーティ リードや非反復読み取りを防ぐことができますが、ファントム読み取りが発生する可能性はあります。
SERIALIZABLE (シリアル化可能) : ACID 分離レベルに完全に準拠した最高の分離レベル。すべてのトランザクションは 1 つずつ実行されるため、トランザクション間の干渉の可能性はありません。つまり、このレベルでは、ダーティ リード、反復不可能なリード、ファントム リードを防ぐことができます。
要約すると、
ここに画像の説明を挿入
ファントム リードを解決する方法:
(1)シリアル化
(2)スナップショット リード: リピータブル リードの場合、MVCC 機構 (マルチバージョン同時実行制御) を使用する
(3)カレント リード: リピータブル リードの場合、ロックに Next-Key Lock を使用する Next-Key Lock は、行ロック (Record Lock) とギャップ ロック (Gap Lock) の組み合わせです。行ロックは既存の行のみをロックできます。
(4)テーブルロック: リピータブルリードトランザクションレベルで、トランザクションで操作するテーブルにテーブルロックを追加します。

五、ロックの分類

1.デッドロック

4つの必要条件:
(1)相互排他、リソースが1つのスレッドによって使用(占有)されている場合、他のスレッドはそのリソースを使用できません。
(2)不可侵。リソース要求者はリソース占有者からリソースを強制的に奪うことはできず、リソースはリソース占有者によってのみ能動的に解放されます。
(3)リクエスト アンド ホールド。つまり、リソース要求者が元のリソースの所有を維持しながら他のリソースを要求するとき。
(4)循環待機、つまり待機キューが存在します。P1 は P2 のリソースを占有し、P2 は P3 のリソースを占有し、P3 は P1 のリソースを占有します。これにより待機ループが形成されます。

A欠B100块钱,B欠C一百块钱,C欠A一百块。A说C还我才能还B,B说A还我才能还C,C 说B还我才能还A。

上記の条件のいずれかを破ると、デッドロックを解決できます。

2. Mysql ロックの分類

図に示すように:
ここに画像の説明を挿入

MVCC の存在により、一般的な SELECT ステートメントの場合、InnoDB はロックを追加しません。

おすすめ

転載: blog.csdn.net/liwangcuihua/article/details/131379341