[データベースチュートリアル] Mysqlトランザクション分離分析

事業紹介

トランザクションは、一連のアトミックSQLクエリ、または独立した作業単位です。つまり、トランザクション内のすべてのステートメントが正常に実行されるか、すべての実行が失敗します。

Mysqlでは、トランザクションサポートはエンジン層で実装されますが、すべてのMysqlエンジンがトランザクションをサポートするわけではありません。たとえば、MyISAMエンジンはトランザクションをサポートしません。これが、MyISAMがInnoDBに置き換えられる重要な理由の1つです。

事件に関しては、私たちは間違いなくACIDについて考えています。

原子性一貫性分離耐久性

分離レベル

データベース内の複数のトランザクションが同時に実行されると、トランザクション分離レベルの概念があるため、ダーティリード、繰り返し不可能なリード、ファントムリードなどの問題が発生する可能性があります。

SQL標準では、次の4つの分離レベルが定義されています。

READ UNCOMMITTED(非コミット読み取り)

トランザクションの変更は、まだコミットされていない場合でも、他のトランザクションに表示されます。トランザクションは、ダーティリード(ダーティリード)とも呼ばれる、コミットされていないデータを読み取ることができます。

コミット済みを読む

トランザクションがコミットされた後、行われた変更は他のトランザクションで確認できます。このレベルは、同じクエリがトランザクションで2回実行された場合、結果が異なる可能性があるため、繰り返し不可の読み取りとも呼ばれます。

REPEATABLE READ(繰り返し可能な読み取り)

トランザクションの実行中は、トランザクションの開始時に表示されるデータと常に一致します。もちろん、このレベルでは、コミットされていないデータの変更は他のトランザクションからも見えません。

SERIALIZABLE(シリアライズ可能)

同じ行のレコードに対して、書き込みと読み取りの両方がロックされます。読み取りと書き込みのロックの競合が発生した場合、後でアクセスされるトランザクションは、続行する前に前のトランザクションの完了を待機する必要があります。これにより、多くのタイムアウトが発生します。競合の問題をロックします。

実装に関しては、ビューがデータベースに作成され、アクセス時にビューのロジックが優先されます。

繰り返し可能な読み取り分離レベルでは、このビューはトランザクションの開始時に作成され、このビューはトランザクション全体で使用されます。

読み取りコミットの分離レベルでは、このビューはSQLステートメントの実行開始時に作成されます。

コミットされていない読み取りの分離レベルでは、レコードの最新の値が直接返され、ビューの概念はありません。

シリアル化された分離レベルでは、並列アクセスを回避するためにロックが直接使用されます。

構成方法は、起動パラメーターtransaction-isolationを目的の分離レベルに設定することです。

現在の設定を表示する:

mysql> 'transaction_isolation'のような変数を表示します。

+ ----------------------- + ----------------- +

| Variable_name | 値|

+ ----------------------- + ----------------- +

| transaction_isolation | 繰り返し可能-読む|

+ ----------------------- + ----------------- +

1列セット(0.00秒)

つまり、存在は合理的であり、さまざまな分離レベルがさまざまなシナリオに適しています。詳細は、ビジネスシナリオに従って決定する必要があります。

トランザクション分離の実装

実際、Mysqlでは、各レコードの更新は同時にロールバック操作も記録し、レコードの最新の値は、ロールバック操作を通じて前の状態の値を取得できます。

システムは、ログをロールバックする必要のあるトランザクションがない場合、ロールバックログを削除すると自動的に判断します。

長いトランザクションの使用が推奨されないのはなぜですか。

トランザクションが長いということは、システムに非常に古いトランザクションビューが存在することを意味します。これらのトランザクションは、トランザクションがコミットされる前にいつでもデータベース内の任意のデータにアクセスできるため、データベースで使用される可能性のあるロールバックレコードを保持する必要があります。多くのストレージスペースを占有します。同時に、長いトランザクションもロックリソースを占有し、ライブラリ全体をダウンさせる可能性があります。

トランザクションの開始方法

トランザクションステートメントを明示的に開始し、トランザクションを開始または開始し、コミットはコミットであり、ロールバックが使用されます。autocommit = 0に設定すると、このコマンドはスレッドの自動コミットをオフにします。つまり、selectステートメントが実行されると、トランザクションが開始され、コミットまたはロールバックをアクティブに実行するか、切断するまで自動的にコミットされません。

個人的な提案は、長いトランザクションの発生を回避するために、最初の方法で明示的にトランザクションを開始することです。

autocommit = 1に設定されている場合、トランザクションはbeginで明示的に開始され、commitが実行されるとトランザクションがコミットされます。コミット作業とチェーンが実行されると、トランザクションがコミットされ、次のトランザクションが自動的に開始されます。これにより、beginステートメントを再度実行するオーバーヘッドも節約されます。

長いトランザクションのクエリ:

次のステートメントは、60秒以上続くトランザクションをクエリするためのものです。

mysql> select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now()、trx_started))> 60;

空集合(0.00秒)

要約すると、開発プロセスでは、長いトランザクションの使用を最小限に抑えるように努めています。やむを得ない場合は、論理ログスペースが十分に大きいことを確認し、動的なログスペースの増加をサポートします。Innodb_trxテーブルを監視し、長いトランザクションアラームを見つけます。

 

さらに、プログラミング能力を向上させたい場合は、C言語とC ++プログラミングを学んでください。カーブで追い越し、一歩速く!ここでお手伝いできるかもしれません〜

UPは、C / C ++プログラミングの学習に関するビデオチュートリアルをホームページにアップロードしています。興味のある方、または学習している方は、ぜひご覧ください。お役に立てれば幸いです〜

共有(ソースコード、実際のプロジェクトビデオ、プロジェクトノート、基本的な入門チュートリアル)

キャリアを変えてプログラミングを学び、自分で考えるよりも早く学び成長するために、より多くの情報を使用するパートナーを歓迎します!

プログラミング学習:

プログラミング学習:

おすすめ

転載: blog.csdn.net/weixin_45713725/article/details/114976760