[データベース] OracleとMysqlのトランザクション分離レベルの比較

簡単な紹介:トランザクションの4つの特性(ACID)

トランザクションには、原子性、一貫性、分離性、耐久性の4つの特性があります。これらの4つの機能は、略してACID機能と呼ばれます。

1.原子性。トランザクションはデータベースの論理的な作業単位であり、トランザクションに含まれるすべての操作は完了したか、完了していないかのいずれかです。

2.一貫性。トランザクション実行の結果は、データベースを一貫した状態から別の一貫した状態にする必要があります。したがって、データベースに成功したトランザクション送信の結果のみが含まれている場合、データベースは一貫した状態にあると言えます。データベースシステムの操作中に障害が発生した場合、一部のトランザクションは完了する前に強制的に中断されます。これらの未完了のトランザクションによってデータベースに加えられた変更の一部は、物理データベースに書き込まれ、データベースは誤った状態になっています。矛盾した状態。

3.分離。トランザクションの実行は、他のトランザクションを妨害することはできません。つまり、トランザクションで使用される内部操作とデータは、他の並行トランザクションから分離されており、同時に実行される各トランザクションが互いに干渉することはありません。

4.持続可能性。永続的とも呼ばれます。これは、トランザクションがコミットされると、データベース内のデータへの変更が永続的であることを意味します。以下のその他の操作または障害は、実行結果に影響を与えません。

Mysqlの4つの分離レベル

SQL標準では、4つのタイプの分離レベルが定義されています。これには、トランザクションの内部と外部のどの変更を表示し、どの表示を非表示にするかを制限する特定のルールが含まれます。ここで注意:低レベルの分離レベルは、通常、より高い並行処理をサポートし、システムのオーバーヘッドが低くなります。

コミットなしの読み取り(コミットされていないコンテンツの読み取り)

この分離レベルでは、すべてのトランザクションが、他のコミットされていないトランザクションの実行結果を見ることができます。この分離レベルは、そのパフォーマンスが他のレベルよりもはるかに優れていないため、実際のアプリケーションではほとんど使用されません。コミットされていないデータの読み取りは、ダーティリード(Dirty Read)とも呼ばれます。

コミット読み取り(送信コンテンツの読み取り)

これは、ほとんどのデータベースシステムのデフォルトの分離レベルです(ただし、MySQLのデフォルトではありません)。これは、分離の単純な定義を満たします。トランザクションは、コミットされたトランザクションによって行われた変更のみを確認できます。同じトランザクションの他のインスタンスがインスタンスの処理中に新しいコミットを行う可能性があるため、同じ選択が異なる結果を返す可能性があるため、この分離レベルは、いわゆる非反復可能読み取り(Nonrepeatable Read)もサポートします。

反復可能な読み取り

これはMySQLのデフォルトのトランザクション分離レベルです。これにより、同じトランザクションの複数のインスタンスが同時にデータを読み取るときに同じデータ行が確実に表示されます。しかし、理論的には、これは別の厄介な問題につながります:ファントムリード。簡単に言えば、幻像読み取りとは、ユーザーがデータ行の範囲を読み取るときに、別のトランザクションがその範囲に新しい行を挿入することを意味します。ユーザーが再び範囲内のデータ行を読み取ると、新しい "ファントム」ライン。InnoDBおよびFalconストレージエンジンは、Multiversion Concurrency Control(MVCC)メカニズムを通じてこの問題を解決します。

シリアライズ可能(Serializable)

これは最高の分離レベルであり、トランザクションの順序付けを強制して相互の競合を不可能にすることにより、幻像の読み取りの問題を解決します。つまり、読み取ったデータの各行に共有ロックを追加します。このレベルでは、多数のタイムアウトとロック競合が発生する可能性があります。

さまざまな分離レベルによって引き起こされる問題

これらの4つの分離レベルは、異なるロックタイプを使用して実装されているため、同じデータが読み取られると、問題が発生しやすくなります。例えば:

ダーティリード:トランザクションがデータのコピーを更新し、別のトランザクションがこの時点で同じデータのコピーを読み取りました。何らかの理由で、前のRollBack操作が実行された場合、次のトランザクションによって読み取られるデータは間違いでしょう。

繰り返し不可の読み取り:トランザクションの2つのクエリでデータに一貫性がありません。これは、2つのクエリの間に挿入されたトランザクションによって更新された元のデータである可能性があります。

幻像読み取り:トランザクションの2つのクエリのデータ項目の数に一貫性がありません。たとえば、1つのトランザクションが複数行のデータをクエリし、別のトランザクションがこの時点で新しいデータ列を挿入します。次のクエリでは、以前にはなかったデータの列がいくつかあることがわかります。

MySQLでは、これらの4つの分離レベルが実装されているため、次のような問題が発生する可能性があります。
ここに画像の説明を挿入

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

2つのOracleトランザクション分離レベルがあります。

(1)READ COMMITTED:読み取りが送信されました

(2)SERIALIZABLE:シリアル読み取り

デフォルトの分離レベルは次のとおりです。READCOMMITTED

デフォルトの分離レベルを表示します。dbms_transactionパッケージとv $ transactionビューを使用して表示および確認できます。

--trans_id Varchar2(100)を宣言するトランザクションを最初に作成します。trans_idを開始します。= dbms_transaction.local_transaction_id(TRUE); end;-トランザクションの分離レベルを表示しますSELECT s.sid、s.serial#、CASE BITAND(t.flag、POWER(2、28))0の場合、READ COMMITTED」ELSE'SERIALIZABLE 'END ASisolation_levelFROM v transactiont JOIN v transaction tJOIN vt r a n s a c t i o n t J O I N vセッションs ON t.addr = s.taddr AND s.sid = sys_context( 'USERENV'、 'SID');设設定間隔离级别コマンド:SET TRANSACTION分離レベル[コミット済み|シリアライズ可能]

MySqlデータベースには4つの分離レベルがあります

デフォルトの分離レベルは次のとおりです。REPEATABLE-READ(繰り返し読み取り)。

デフォルトの分離レベルを表示します。@@ tx_isolationを選択します。

分離レベルの設定コマンド:グローバルトランザクションの分離レベルを設定します。

これでこの問題を共有できました。またお会いしましょう~~~

おすすめ

転載: blog.csdn.net/weixin_42777004/article/details/107608709