InnoDBトランザクション

InnoDBは、MySQLサーバーを使用したトランザクション型のリレーショナルエンジンです。 2001年以降、標準アセンブリで提供されており、バージョン5.1からプラグインとしてインストールできます(サーバーコアを再コンパイルする必要はありません)。 構文は非常に単純です。

START TRANSACTION;

...

COMMIT; -- ROLLBACK; -






定義について



トランザクション性と関係性の定義とは、まず、 FKを介したテーブルの完全な接続を意味し、その結果、行を削除する際のデータの整合性を意味します。 MyIsamでは、ご存知のように、複数のテーブルの関連データを手動で削除する必要がありました; InnoDBでは、単一のクエリによるカスケード削除。 第二に、SVNのようなデータの並列バージョンはデータベースでは考えられないため、これらのバージョンを1つのブランチにまとめることはできませんが、同じデータを持つ複数のプロセス(ユーザー)の並列作業が必要な場合、トランザクションがソリューションになります。

request-carキューは、アトミックバストランザクションで補充されるようになりました。 当然、トランザクションが実行される時間が長くなるほど、より多くの並列プロセスが待機するため、これは悪いことです。 作業を高速化するために、停止が作成されます-データブロックの種類とレベル。 InnoDBのデフォルトでは、これは行レベルのロック( PK )ですが、MyIsamでは、アトミック操作がテーブル全体をロックします。





トランザクション=ロック



したがって、2つのエンジンを比較することはできません。2つのプロセスの同じ行へのキューの確率が低いため、トランザクションの性質上、InnoDBは行レベルまで下がる必要があります。 ただし、その結果、各行にロックフラグを作成する必要があります。これは、メモリが少し増えることを意味します。 データブロックレベルの違いにより、InnoDBとMyIsamをプロセス数に応じたパフォーマンスの観点から比較することは非常に困難です。

ロックにはいくつかのタイプがあります。



教育プログラムとして、テーブル全体を手動でブロックできます(ただし、InnoDBの場合はすべてのプロセスが悲惨なほど遅くなるため、不要です)。 再ロックすると、以前のロックが削除されます。 仮想テーブル(ビュー)をブロックすることもできます

LOCK TABLES user WRITE, company READ;

UNLOCK TABLES;








分離レベル



2つのプロセスが同時にかつ部分的に共通データに影響を与える場合、すべてのデータが完全にブロックされるわけではありません。 並行トランザクションが保留中のトランザクションにアクセスする場合、免除があります。

現在のレベルは、設定から取得したり、設定に登録したり、リクエストによって実行したりできます-トランザクションの期間と接続全体の期間の両方。

SELECT @@global.tx_isolation;

SET TRANSACTION ISOLATION LEVEL READ COMMITED;






SQL92標準に従って降順での正確度(ロックの厳密さ)に応じて、以下があります。



REPEATABLE READにファントム挿入の問題があります。 UPDATEの行のみがブロックされ、INSERTの行はブロックされないため、繰り返し読み取りトランザクションと並行して挿入を行うことができます。これにより、幻の行が生成されます。 これを回避するために、InnoDBは3つのロック方法を使用します-行、範囲、および挿入の場合の次の行(より深い読みはしませんでした)

この理論全体は確かに有用ですが、実際には実際の要求によって使用されます。

  1. REPEATABLE READレベルでの読み取り(書き込みロック)。 誰かがデータに取り組んでいる場合は待機しています。

    SELECT... LOCK IN SHARE MODE



  2. SERIALIZEABLEモードでの読み取り(読み取り/書き込みロック)

    SELECT... FOR UPDATE





トランザクションの継続中のこれらの要求により、新しいモードに入ります。

デッドロック傷害



デッドロック、つまり プログラミングでは、同じデータを必要とする、または互いに依存する同時プロセス(スレッド)のデッドロックがしばしば発生します。 InnoDBも例外ではありません。 たとえば、進行中のトランザクションが2つあり、それぞれが現在ロックされているリソース(行/行の範囲)を変更する場合です。 トランザクションを終了できないことが判明しました。

そのような状況では、InnoDBはトランザクションの1つをロールバックし、エラーをスローするように強制されます

ERROR 1213 (40001): Deadlock found when trying to get lock; try

restarting transaction






このような問題は、複数のプロセスによる行の大規模な並列挿入/変更/削除で発生します。 MySQL は、すべてのトランザクションにトランザクションの再実行を装備することをお勧めします。

トピックについて..





オリジナル記事



All Articles