[MySQL]トランザクション

1 はじめに

トランザクションはデータベース管理システムにおいて非常に重要な概念であり、この記事では主にトランザクションの 4 つの特徴、トランザクションの同時実行によって発生する可能性のある問題、およびトランザクションの分離レベルについて紹介します。

2. 事業紹介

トランザクションは操作の集合です。分割できない作業単位です。トランザクションは、システム全体に対して操作リクエストを送信または取り消します。つまり、これらの操作は同時に成功するか失敗します

トランザクションの利用シナリオの代表例は送金です。送金ミスは許されず、ちょっとしたことで大きな損失が発生します。たとえば、このときユーザー A がユーザー B に 200 元を送金すると、データベース内で実行される操作は次のようになります。ユーザー A の残高を 200 減らし、ユーザー B の残高を 200 増やします。

トランザクションを使用しない場合、ユーザー A の残高が 200 減った後、ユーザー B の残高に 200 を追加するためにデータベースを実行すると、データベースがハングするか異常な状態が発生し、ユーザー B の残高は 200 追加されません。そうすると、A は理由もなく 200 元を失うことになります。このとき、問題は非常に大きくなります。
しかし、トランザクションが使用されると、ユーザー A の残高は 200 減り、ユーザー A の残高は 200 元減ります。ユーザー B は 200 ずつ増加します。これら 2 つの操作は全体です。結果は成功または失敗の 2 つです。その後、上記の問題は簡単に対処できます。上記の問題が発生した場合、データベースはこの時点でトランザクションをロールバックします。元に戻す操作として理解できる時間 データを実行する前にデータを復元する これはトランザクションの重要性を示しています。

3. トランザクション操作

トランザクション操作には、トランザクションをオープンする、トランザクションをコミットする、トランザクションをロールバックするという3 つの主な操作があります。

MySQL でトランザクションを開始するには 3 つの方法があります。

使用 BEGIN语句可以手动开启
使用 SET AUTOCOMMIT=0/1 语句(0为手动提交,1为默认提交)
使用 START TRANSACTION语句

トランザクションのコミットとロールバック:

COMMIT; # 提交事务
ROLLBACK; # 回滚事务

MySQL のトランザクションはデフォルトでコミットされます。つまり、DML ステートメントが実行されると、MySQL は暗黙的にトランザクションをコミットします。

先ほどの送金の例で言えば、実際には、ユーザー A とユーザー B の残高を 2 段階に分けて変更するのが主なステップです。もちろん、厳密さを追求する場合は、残高が送金前の金額より大きいかどうかを判断することもできます。転送。ここでは書きません。
初期状態のユーザー A とユーザー B のバランス:
ここに画像の説明を挿入
次に、トランザクションを使用して、データベースの実行プロセス中に発生する可能性のある上記の問題に対処します
ここに画像の説明を挿入
。ここでは、データベースエラーの状況をシミュレートするために、SQL ステートメントを間違ったものに変更します。SQL
ステートメントの実行後、ユーザー A の残高が変更されたことがわかります。しかし、ユーザー B の残高は変更されていません。
ここに画像の説明を挿入
この時点で、データは変更されています。トランザクションをロールバックしてデータを復元します トランザクションを
ここに画像の説明を挿入
ロールバックすると、ユーザーAとユーザーBのデータが変更前のデータに復元されたことがわかります。

4. 取引の4つの特徴

トランザクションには、ACID プロパティとも呼ばれる次の 4 つのプロパティがあります。

  1. アトミック性: トランザクションはアトミックな操作であり、分割することはできません。操作のすべてのステップは、すべて完了するか未完了のいずれかであり、部分的に完了することはありません。いずれかの操作が失敗した場合、トランザクションは開始前の状態にロールバックされ、変更されたデータはすべて元に戻されます。

  2. 一貫性:トランザクションの実行前と実行後、データベースの状態は一貫している必要がありますトランザクション実行前のデータベース状態は正当な状態であり、実行後のデータベース状態も正当な状態である必要があります。言い換えれば、トランザクションの実行中に矛盾や衝突は発生せず、データの完全性と正確性が保証されます。

  3. 分離: 複数のトランザクションが同時に実行される場合、各トランザクションの操作は、相互に干渉することなく、他のトランザクションの操作から分離される必要があります各局が行う変更は、相​​互に干渉しないように、他の局が行う変更から独立していなければなりません。同時実行性の問題を引き起こすことなく、各トランザクションが独立して実行されることが保証されます。

  4. 耐久性:トランザクションがコミットされると、その変更はデータベースに永続的に保存され、システムがクラッシュしても失われることはありません。データの永続性により、トランザクションのコミット結果が取り消されず、システム障害やクラッシュが発生した場合でも回復できることが保証されます。

トランザクションの 4 つの特性は、データベース操作プロセスの信頼性、一貫性、耐久性を保証し、データの整合性と正確性を保証する重要な手段です。

5. 同時トランザクションの問題

トランザクションは同時実行制御の基本単位であり、同時トランザクションはトランザクションの ACID 特性を破壊する可能性があります。同時トランザクションには次の 3 つの問題が発生する可能性があります。

  • ダーティ リード: ダーティ リードとは、トランザクションが別のコミットされていないトランザクションのデータを読み取るときに、コミットされていないデータを読み取ることを意味します。別のトランザクションがロールバックした場合、このトランザクションによって読み取られたデータは無効になります。ダーティ リードはデータの不整合を引き起こす可能性があります。
  • 非反復読み取り: 非反復読み取りとは、1 つのトランザクションが同じデータ セットを複数回読み取ることを意味しますが、この期間中に別のトランザクションがこのデータ セットを更新するため、最初のトランザクションによって 2 回読み取られたデータに不整合が生じます。反復不可能な読み取りはデータの不整合を引き起こす可能性があります。
  • ファントム読み取り: ファントム読み取りとは、1 つのトランザクションがデータのセットを読み取った後、別のトランザクションが新しいデータを挿入することを意味します。その結果、最初のトランザクションが同じデータのセットを再度読み取り、データが 1 つ増加したことがわかり、幻想。ファントム読み取りはデータの不整合を引き起こす可能性があります。

上記の 3 つの問題は、複数のトランザクションの同時実行によって発生します。これらの問題の解決策は次のとおりです。

  1. ロック: 共有データをロックすることにより、共有データへの各トランザクションのアクセスが相互に排他的であることが保証され、ダーティ リードや反復不可能な読み取りの問題が解決されます。
  2. MVCC (Multi-Version Concurrency Control) : 各トランザクションのビューにデータのバージョン情報を記録することで、各トランザクションで読み取られるデータの一貫性が保証され、非反復読み取りやファントム読み取りの問題が解決されます。
  3. シリアル化: 同時トランザクションをシリアルに実行することにより、各トランザクションは同時実行性の問題なく独立して実行されることが保証されます。ただし、シリアル化によりシステムの同時実行性とスループットが低下するため、同時実行性が高いシナリオには適していません。

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

トランザクションの分離レベルは、複数の同時トランザクション間の分離の程度を指します。MySQL は、低から高までの 4 つの分離レベルをサポートします。

  1. Read Uncommitted (Read Uncommitted): あるトランザクションが、別のトランザクションによってコミットされていないデータを読み取ることを許可する最も低い分離レベル。これにより、ダーティ リード、反復不可能な読み取り、およびファントム リードが発生する可能性があります。

  2. Read Committed (Read Committed): トランザクションが別のトランザクションによってコミットされたデータを読み取ることを許可し、ダーティ リードの問題を回避しますが、それでも再現不可能な読み取りやファントム リードの問題が発生する可能性があります。

  3. 反復可能読み取り (反復可能読み取り): 同じトランザクション内で同じデータ セットが複数回読み取られる場合、読み取りデータが常に一貫していることを確認し、ダーティ リードや非反復読み取りを回避しますが、それでもファントムリードが発生する可能性があります。

  4. Serializable: 最高の分離レベル。同時トランザクションをシリアルに実行することですべての同時実行の問題を回避しますが、パフォーマンスの低下につながります。

分離レベル ダーティリード 反復不可能な読み取り 連載
コミットされていない読み取り
コミットされた読み取り ×
反復可能な読み取り × ×
シリアル化可能 × × ×

トランザクション分離レベルを表示します。

select @@transaction_isolatio;

トランザクションの分離レベルを設定します。

SET [SESSION/GLOBAL] TRANSACTION ISOLATION LEVEL <隔离级别>;
# SESSION: 针对当前的会话窗口有效
# GLOBAL: 对所有客户端的会话窗口有效

分離レベルが高いほど、相互の分離度は高くなりますが、パフォーマンスの低下やデッドロックなどの問題が発生する可能性もあります実際のアプリケーションでは、さまざまなビジネス要件やシステムのパフォーマンスに応じて適切な分離レベルを選択する必要があります。MySQL のデフォルトの分離レベルは、Repeatable Read です。

7. まとめ

トランザクションはデータベース管理システムの正確性、信頼性、整合性、セキュリティにとって非常に重要であり、データ品質を保証するための重要な手段です。同時トランザクションによって発生する可能性のある問題とその問題が何を意味するかを理解し、同時トランザクションによって発生する可能性のある問題に対処するためにトランザクションの分離レベルを合理的に設定する方法を学びます。

ご覧いただきありがとうございます! この記事がお役に立てば幸いです!
コラム: "Speedthrough MySQL"は常に更新されています。購読を歓迎します!
「あなたを励まし、手を携えて進歩したいと考えています!」
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_63463510/article/details/130534523