MetaServiceは、Deltaテーブルの原子性、一貫性、分離、および耐久性 (ACID) セマンティクスを確保するために、Deltaテーブルに対するすべてのデータ変更操作をトランザクションとして一元的に管理します。 マルチバージョン同時実行制御 (MVCC) モデルは、スナップショットに対する読み取り操作と書き込み操作の分離を保証するために使用され、楽観的同時実行制御 (OCC) モデルは、楽観的トランザクション同時実行制御を制御するために使用されます。
競合検出ルール
次の表に、同じパーティション分割されていないテーブルまたはパーティション上の同時実行ジョブ間の競合を処理するために使用されるルールを示します。
ジョブタイプ | INSERT OVERWRITE /トランケート (後で終了するジョブ) | INSERT INTO (後で終了するジョブ) | 更新 /削除 (後で終了するジョブ) | 小型 (後で終了するジョブ) | 大規模なコンパクト (後で終了するジョブ) |
INSERT OVERWRITE /TRUNCAT (早く終了するジョブ) | 両方の仕事は成功します。 後で終了するジョブの結果データは、先に終了するジョブの結果データに上書きされます。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 |
INSERT INTO (早く終了するジョブ) | 両方の仕事は成功します。 後で終了するジョブの結果データは、先に終了するジョブの結果データに上書きされます。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 | 両方の仕事は成功します。 後で終了するジョブのコンパクション操作が成功しました。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 |
UPDATE /DELETE (早く終了するジョブ) | 両方の仕事は成功します。 後で終了するジョブの結果データは、先に終了するジョブの結果データに上書きされます。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 | 両方の仕事は成功します。 後で終了するジョブのコンパクション操作が成功しました。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 |
MINOR COMPACT (早く終了するジョブ) | 両方の仕事は成功します。 後で終了するジョブの結果データは、先に終了するジョブの結果データに上書きされます。 | 両方の仕事は成功します。 後で終了するジョブに対して新しいデータが書き込まれます。 | 両方の仕事は成功します。 後で終了するジョブに対して新しいデータが書き込まれます。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 | 両方の仕事は成功します。 後で終了するジョブのコンパクション操作が成功しました。 |
MAJOR COMPACT (早く終了するジョブ) | 両方の仕事は成功します。 後で終了するジョブの結果データは、先に終了するジョブの結果データに上書きされます。 | 両方の仕事は成功します。 後で終了するジョブに対して新しいデータが書き込まれます。 | 両方の仕事は成功します。 後で終了するジョブに対して新しいデータが書き込まれます。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 | 以前に終了したジョブは成功します。 後で終了するジョブに対してエラーが返されます。 |
同時実行競合の最適化
上記の競合検出ルールは、行またはファイルレベルでの同時操作には適用されません。 データ処理動作のシーケンスは、トランザクションとして管理される。 特定の頻繁に実行されるオペレーションに対して、トランザクション競合処理ロジックは、データの正確性を前提としたオペレーションのセマンティクスに基づいて最適化される。 これは同時実行制御をよりよくサポートします。 たとえば、トランザクションでクラスタリング操作とINSERT INTO操作を同時に実行します。 トランザクションの開始時刻とコミット時刻が重複してもトランザクションは失敗しません。 これは、クラスタリング操作によってデータの整理方法が変更されるが、データの状態は変更されないためである。 クラスタリング操作とINSERT INTO操作は, ステータスの不整合が発生せず, 同時に実行できます。 トランザクション競合処理ロジックは、より多くのシナリオに適応するように最適化され続けます。
競合検出が失敗した場合、データの正確性を前提としてメタデータレベルの再試行が実行されます。 データを再度読み書きする必要はありません。 これにより、ユーザーエクスペリエンスが向上し、リソース消費が削減されます。
メタデータは、データの一貫性を確保するためにアトミックに更新されます。
同時実行競合最適化は、単一テーブルのトランザクション管理にのみ適用されます。
データファイルのバージョン管理
各トランザクションは、新しいデータファイルのバッチを生成する。 これらのデータファイルは、次のトランザクションバージョンに関連付けられています。
Time version: TIMESTAMPタイプのトランザクションコミット時刻を示します。 新しいタイムバージョンは、ユーザーによってトリガーされ、論理データが変更された操作に対してのみ生成されます。 クラスタリング操作とコンパクション操作は、物理データの再編成と最適化のみで、データの追加や変更は行いません。 したがって、クラスタリングおよびコンパクション操作のために新しいタイムバージョンは生成されません。 このように、ユーザーが時間バージョンに基づいて増分クエリを実行する場合、クラスタリングおよび圧縮操作によって生成されたデータファイルはクエリされません。 これはビジネス要件を満たしています。
IDバージョン: 自動インクリメント整数。 増分IDバージョンは、エンジン内で実行されるクラスタリングおよび圧縮操作を含む、トランザクション内の任意のデータ操作に対して生成される。 IDバージョンは主に内部トランザクション管理に使用されます。 IDバージョンもユーザーに公開され、増分クエリに使用できます。