1

私はSQLを研究していて、特定のトランザクションスキームがシリアル化可能かどうかを知る必要があります。これを決定する方法は、ノードとしてのトランザクションとノード間の方向を使用してグラフを作成することであり、グラフが循環的である場合、スキームはシリアル化できないことを理解しています。しかし、それはどういう意味で、あるトランザクションから別のトランザクションへのグラフに有向エッジがあるかどうかを決定するものは何ですか?この場合のシリアル化は、オブジェクトをディスクに書き込むのと同じ種類のシリアル化ですか?

洞察をありがとう

4

2 に答える 2

4

トランザクションのシリアル化は、オブジェクトのシリアル化とは何の関係もありません。シリアライズ可能なトランザクションの分離レベルが完全に実装されると、トランザクションが 1 つずつ実行されたかのように、シリアライズ可能な並行トランザクションの任意のセットの動作が、シリアル (一度に 1 つずつ) の実行シーケンスと一致することが保証されます。時間。これは、データベース トランザクションが単独で実行されたときに正しいことを行うことを示すことができれば、シリアル化可能なトランザクションの任意の組み合わせで正しいことを行うか、再試行できるようにシリアル化の失敗でロールバックされることを意味します。はじめから。

シリアライズ可能なトランザクションの分離は、さまざまな方法で実施できます。最も一般的な方式は、厳密な 2 フェーズ ロック (S2PL) です。これは非常に一般的であるため、この手法の観点からのみ説明している SO に関する回答がよく見られます。楽観的同時実行制御 (OCC)、シリアライズ可能なスナップショット分離 (SSI) などもあります。

9.1 より前のバージョンの PostgreSQL、一部の構成の MS SQL Server、およびすべてのバージョンの Oracle は、実際にはシリアライズ可能なトランザクションを提供していません。それらを要求することができますが、実際にはスナップショット分離を提供します。9.1 以降の PostgreSQL バージョンでは、シリアライズ可能なトランザクション分離が要求されたときにSSIを使用します。

これらの手法のいずれかが SO 回答でどのように機能するかを完全に議論することはできませんが、上記の手法を要約することはできません。

  • S2PL では、トランザクション内のすべての書き込みは、何とも共有できないロックを取得し、トランザクション内のすべての読み取りは、他の読み取りと共有できるが書き込みとは共有できないロックを取得します。読み取りロックは、スキャンされたインデックスの「ギャップ」をカバーする必要があります。ロックはトランザクションが終了するまで保持され、トランザクションの作業が他のトランザクションから見えるようになるとアトミックに解放されます。ブロックによって循環が生じる場合、これは「デッドロック」と呼ばれ、循環に関与するトランザクションの 1 つがロールバックされます。

  • OCC では、トランザクションは使用したデータをロックせずに追跡します。トランザクションのコミットが要求されると、トランザクションは、他のトランザクションがそのデータを変更してコミットしたかどうかをチェックします。その場合、コミット要求は失敗し、作業はロールバックされます。

  • SSI の下では、書き込みは互いにブロックしますが、読み取りは書き込みをブロックせず、書き込みは読み取りをブロックしません。実行の明らかな順序でサイクルを作成する可視性のパターンを探すために、読み取りと書き込みの依存関係が追跡されます。「危険な構造」が見つかった場合、つまり実行の見かけ上の順序でサイクルが発生する可能性がある場合、発生する可能性のあるサイクルに含まれるトランザクションの 1 つがロールバックされます。S2PL よりも OCC に似ていますが、より高い競合下でのロールバックはそれほど多くありません。

完全な開示: 私は MIT の Dan RK Ports と協力して、新しい SSI ベースのシリアル化可能なトランザクションを PostgreSQL 9.1 に実装しました。

于 2012-05-11T11:48:50.013 に答える
2

シリアライゼーションとは、トランザクションを順番に順次実行できることを意味します (オブジェクトのシリアライゼーションとは関係ありません)。基本的にトランザクションは、インターリーブされる順序に関係なく、シリアライズ可能であり、結果はシリアルで実行されたかのようになります。ちなみに、グラフが循環している場合、シリアライズ可能ではなく、競合のリスクがあります。ここでは、分離レベルが、トランザクションをシリアルに実行するかどうかを決定するのに役立ちます。競合がないことを期待して、インターリーブされた方法で実行しようとする必要があります。完全な答えではありませんが、これが役立つことを願っています。

于 2012-05-11T08:19:06.027 に答える