トランザクションのシリアル化は、オブジェクトのシリアル化とは何の関係もありません。シリアライズ可能なトランザクションの分離レベルが完全に実装されると、トランザクションが 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 に実装しました。