ホームページ  >  記事  >  データベース  >  MySQL トランザクション分離についての簡単な説明

MySQL トランザクション分離についての簡単な説明

青灯夜游
青灯夜游転載
2020-04-04 09:29:511943ブラウズ

この記事では、MySQL トランザクション分離について説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。

MySQL トランザクション分離についての簡単な説明

#トランザクションの概要

トランザクションは、アトミックな SQL クエリのセット、または独立した作業です。ユニット。つまり、トランザクション内のステートメントはすべて正常に実行されるか、すべて失敗するかのどちらかです。

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

トランザクションに関して言えば、間違いなく ACID を思い浮かべます。

  • 原子性

  • 一貫性

  • ##絶縁性

  • 耐久性

絶縁レベル

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

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

  1. READ UNCOMMITTED (コミットされていない読み取り)

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

  2. READ COMMITTED

    トランザクションが送信されると、その変更は他のトランザクションから確認できるようになります。トランザクション内で同じクエリが 2 回実行されると結果が異なる可能性があるため、このレベルは非反復読み取りとも呼ばれます。

  3. REPEATABLE READ(繰り返し読み取り)

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

  4. SERIALIZABLE(シリアル化可能)

    レコードの同じ行については、書き込みと読み取りがロックされます。読み取り/書き込みロックの競合が発生した場合、後でアクセスされるトランザクションは、前のトランザクションが完了するまで待ってから続行すると、タイムアウトやロック競合の問題が大量に発生します。

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

Repeatable Read の分離レベルでは、このビューはトランザクションの開始時に作成され、トランザクション全体で使用されます。

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

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

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

設定方法は、起動パラメータ

transaction-isolation を目的の分離レベルに設定することです。

現在の設定を表示:

mysql> show variables like 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

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

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

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

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

長いトランザクションの使用が推奨されない理由:

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

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

  • トランザクション ステートメントを明示的に開始します。トランザクションを開始または開始します。送信とはコミットを意味します。 return ロールバックを使用します。

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

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

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

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

次のステートメントは、60 秒を超えるトランザクションをクエリします。

mysql> select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;
Empty set (0.00 sec)

要約すると、開発プロセス中に、長いトランザクションを使用することをできるだけ少なくしてください。それが避けられない場合は、論理ログ スペースが十分な大きさであることを確認し、動的なログ スペースの増加をサポートしてください。 Innodb_trx テーブルを監視し、ロング トランザクション アラームを報告します。

推奨: 「

mysql ビデオ チュートリアル

以上がMySQL トランザクション分離についての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はgithub.ioで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。