web-dev-qa-db-ja.com

START TRANSACTION WITH CONSISTENT SNAPSHOTがSERIALIZABLE分離レベルで機能しないのはなぜですか?

START TRANSACTIONのMySQLドキュメント は次のように述べています。

一貫した読み取りを許可する唯一の分離レベルは、REPEATABLE READです。他のすべての分離レベルでは、WITH CONSISTENT SNAPSHOT句は無視されます。 WITH CONSISTENT SNAPSHOT句が無視されると、警告が生成されます。

SERIALIZABLE分離レベルがREPEATABLE READを超えると、一貫した読み取りが提供されると思ったので、私は驚いています。

WITH CONSISTENT SNAPSHOTSERIALIZABLEトランザクションを処理できない原因は何ですか?

私も 2012年のこのバグレポート を見つけましたが、ドキュメントは最初、これがREPEATABLE READSERIALIZABLEの両方で機能することを述べ、明示的にREPEATABLE READのみに変更しました、これには技術的な理由があるようです。私はそれをテストしましたが、MySQLはSERIALIZABLEと共に使用すると警告を生成します。

1
Benjamin

WITH CONSISTENT SNAPSHOT修飾子は、それが可能なストレージエンジンの一貫した読み取りを開始します。

一貫性のある読み取り同時に実行されている他のトランザクションによって実行された変更に関係なく、スナップショット情報を使用して、特定の時点に基づいてクエリ結果を提示する読み取り操作。

SERIALIZABLE分離レベルでは、必要なすべてのデータがトランザクションによってすでにロックされているため、スナップショットを使用する必要はありません。

SERIALIZABLE分離レベルは、REPEATABLE READよりもACIDに準拠している必要があります。これは、2番目のレベルが非ロック読み取りを許可するため、ACIDのI(分離)規則に違反する可能性があるためです。

1
Nikita

これは主に私の推測ですが、技術的な理由は、SERIALIZABLEトランザクションが有効になったときです。

トランザクション分離レベルに関するMySQL 5.7ドキュメント のパラグラフ4によると

ACIDへの準拠が重要な重要なデータの操作では、デフォルトのREPEATABLE READレベルで高度な一貫性を強制できます。

...

SERIALIZABLEはREPEATABLE READよりもさらに厳しい規則を適用し、主に次のような特殊な状況で使用されますXAトランザクション、および並行性とデッドロックに関する問題のトラブルシューティング用。

どのようにしてSERIALIZABLEREPEATABLE READよりも厳しい整合性ルールを強制させることができますか?同じドキュメントページのSERIALIZABLEの定義に注意してください。

このレベルはREPEATABLE READに似ていますが、自動コミットが無効になっている場合、InnoDBはすべてのプレーンSELECTステートメントを暗黙的にSELECT ... LOCK IN SHARE MODEに変換します。自動コミットが有効な場合、SELECTは独自のトランザクションです。したがって、読み取り専用であることが知られており、一貫性のある(非ロック)読み取りとして実行され、他のトランザクションをブロックする必要がない場合は、シリアル化できます。 (他のトランザクションが選択された行を変更した場合にプレーンSELECTを強制的にブロックするには、自動コミットを無効にします。)

したがって、違いを確認するには、自動コミットを実験する必要があります。

SERIALIZABLEで自動コミットを無効にすると、SELECT ... LOCK IN SHARE MODEが呼び出されて読み取り可能なロックが発生しますが、読み取りが行われる前の特定の段階でREPEATABLE READにロックが先制的に表示されます。

自動コミットを有効にすると、ロックなしの読み取りはワイルドに実行され、読み取られるデータは基本的に同じになるため、SERIALIZABLEREPEATABLE READのように表示されます。

この観点からトランザクションを見ると、共有ロックが停滞しているため、SERIALIZABLEが一貫しているとは決して言えません。これにより、一貫性が失われます。これが、REPEATABLE READACID準拠 に使用される唯一の分離レベルである理由です。

したがって、SERIALIZABLEで作成されたスナップショットは、REPEATABLE READとは対照的に、異なる時点で異なって見える可能性があります。

0
RolandoMySQLDBA