[インタビュー]は、データベースのトランザクション分離レベルの迅速な理解を持っている必要があります

写真は、異常が行くことができる示しhttps://juejin.im/post/5d5575dde51d4561a705baddを見ます

取引の概要

私が使用したMySQLの友人が業務を知っていると信じて、私たちはしばしば、取引の役割を説明するために、この例を通して:データベースは口座残高Aを削減する、2つのステップに分けることができますB、への転送を、Bは口座残高を増加させました。しかし、口座残高時間の短縮など、データベースの突然の出現がダウンしている場合、それは少数のAのバランスがあるだろうではありませんが、バランスはBの状況を増加していませんか?答えはノーです。その理由は、データベースがトランザクション(などのMySQL、Oracleの、などの一般的に使用されるリレーショナルデータを、)サポートしていることです。

トランザクションは、すべての操作が、正常に完了しそうでなければ各操作で行われ、すべての変更が取り消されなければならず、操作の厳格なアプリケーションのシリーズです。これは、トランザクションがアトミック、トランザクション内の一連の操作を持っている、のいずれかですべてが成功するか、何も行いません。

トランザクションがとても成功したすべてのステップを実行するトランザクション、の二つの端があり、トランザクションがコミットされます。ステップが失敗した場合、トランザクションの開始元に戻すには、元に戻す操作の前になるように、ロールバック操作は、発生します。

トランザクションのACID特性

これは一般的な問題である、インタビューもしばしば尋ねる:トランザクションのACID特性とは何ですか?アトミック(原子性)、一貫性(一貫性)、アイソレーション(分離)と永続性(耐久性):ACIDはここに4つの単語を表しています。

1、アトミック。トランザクションは作業データベースの論理的な単位で、トランザクション内のすべての操作はどちらか含ま行うか行いません

2、一貫性。データベーストランザクションの実行の結果は、別の一貫性のある状態にある一貫した状態から変更されなければなりません。そのため、データベースが成功したトランザクションの結果だけがコミット含まれている場合に、一貫性のある状態でデータベースを言います。障害データベース・システムが実行されている場合、いくつかは、その後、データベースは悪い状態になり、データベースに対して行われた変更を完了しなかったこれらのトランザクションは、データベースの物理的な部分に書き込まれているが完了していないトランザクションを中断することを強制、またはあるし、矛盾した状態。

3、単離。他のトランザクションによる干渉を受けないトランザクションの実行。すなわち、操作および他の同時トランザクションが単離されると同時に実行される各トランザクションの間に互いに干渉することができないトランザクション内のデータを使用します。

4、永続的。また、恒久的として知られ、それは、トランザクションのコミット後、データベース内のデータを変更すると、それは永久的でなければならないことであることを意味します。次の操作またはその他の障害が結果に影響を及ぼさないようにしてください。

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

彼は、トランザクション分離レベルの前に、以下の質問を見てみましょうと言いました。

1、汚れは(ダーティリード)を読み込みます

いわゆるダーティリードは、データを他のコミットされていないトランザクションにアクセスするには、取引を指します。そのような変更されたデータのトランザクションが、トランザクションを提出しなかった場合、B A・リード・トランザクションは読み込み、汚れている、データのトランザクションを変更しますが、コミットされません。

2、非反復可能読み取り(非反復可能読み取り)

これは、同じデータを複数回読んで、取引を指します。この取引が終わっていない場合は、別のトランザクションは、同じデータにアクセスします。二つによる第2のトランザクションの変形に、第一のトランザクション内のデータを読み取る間にので、次に最初の二つのトランザクションは、データが異なっていてもよい読み取ります。これには、非反復可能読み取りと呼ばれる2件の読み出しデータが同じでない取引で発生しました。

3、ファントム読み取り(ファントムリード)

複数のクエリが結果セットを返す同じトランザクション内で読み取るいわゆるファントムを意味する(例えば、増加または行の低下など)が同じではありません。例えば、同じトランザクションn個のレコードが最初のクエリが、問い合わせが、nは同じ条件で+ 1つのレコードの第二時間内に、それは幻覚、なぜ同じ結果その倍のようなものです。トランザクションの別の追加または最初のトランザクションデータ内の結果セットを削除または修正であるため、実際には、非反復可能読み取りとして、ファントム読み込みが発生します。非反復データの内容が同じレコードが変更されて読み込まれることを除いて、ファントムはデータ行を読み取るとなる多かれ少なかれ

上記のいくつかの問題を理解した後、私たちは、トランザクション分離レベルの4種類を見てみましょう。

1、READ UNCOMMITTED(コミットは、コンテンツを読みます)

この分離レベルでは、すべてのトランザクションは、他のコミットされていないトランザクションの結果を見ることができます。その性能は他のレベルよりもはるかに良いではありませんので、この分離レベルはほとんど、実際には使用されません。非コミット読み取りデータは、また、ダーティリードと呼ばれます。

2、(提出を読んで)コミット読みます

これは、ほとんどのデータベースシステムのデフォルトの分離レベル(MySQLのではなく、デフォルト)です。それは、分離の簡単な定義を満たす:トランザクションが唯一の変化は、企業が行う提出されている見ることができます。これは、非反復可能読み取り(非反復可能読み取り)と呼ばれています。

3、反復可能読み取り(再読み込みすることができます)

これは、データが読み込まれたとき、それは同じデータ行が表示されます、同じトランザクション複数の同時インスタンスことを保証し、デフォルトのMySQLのトランザクション分離レベルです。マジック読書(ファントムリード):しかし、理論的には、それは別の厄介な問題につながります。簡単に言えば、ファントム読み取りは、ユーザがデータ行の範囲を再読み込みする場合、データ行の範囲を読み込み、別のトランザクションおよび範囲内に新しい行を挿入するとき、あなたは「新しい発見をすることを意味しますファントム「行。マルチバージョン同時制御(貫通のInnoDBとファルコンストレージエンジンMVCC問題を解決するために、マルチバージョン同時実行制御)機構。

4、シリアライズ(直列化)

これは、ファントムが読ん問題を解決するために、それは不可能互いに競合すること、トランザクションを分類することを余儀なくされ、分離の最高レベルです。要するに、それは、読み取られたデータの各行に対して共有ロックを追加することです。このレベルでは、それがタイムアウトとロック競合の多くにつながる可能性があります。

要約を生じる可能性が4つの分離レベルの問題

直列化の最悪性能に加えて(直列化)分離レベルは、ダーティ・リード、非反復リード、ファントムリード、他の分離レベルの外に1つ以上の問題があると思われません。しかし、MySQLのInnoDBエンジンは、MVCCの方法で問題が反復可能読み取り読んファントムを解決します。

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

ビューの分離レベル

# 查看当前连接的隔离级别
SELECT @@session.tx_isolation;
# 查看全局的事务隔离级别
SELECT @@global.tx_isolation;

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

1、グローバル変更

このようmysql.iniの窓などのMySQLの設定ファイルの変更、で、Linuxはmy.cnfファイルです。

#可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
[mysqld]
transaction-isolation = REPEATABLE-READ

2、接続設定指令電流

# 可选参数为:read uncommitted、read committed、repeatable read、serializable
set session transaction isolation level xxx

国民の関心をリードする情報なし

検索公共Happyjava数は[]、[返信]や[ビデオ]電子書籍、電子書籍あなたは、品質とビッグデータ、カフカ、nginxの、MySQLと他のビデオの多くを得ることができます
情報の懸念へのアクセス

おすすめ

転載: www.cnblogs.com/happy4java/p/11361290.html