マルチステートメント トランザクションを使用した BigQuery における Mercury の発展
Google Cloud Japan Team
※この投稿は米国時間 2021 年 7 月 1 日に、Google Cloud blog に投稿されたものの抄訳です。
ローマ神話における商売の神である Mercury(メルクリウス)は、商取引の象徴である財布を持ち、翼の生えたサンダルを履いて疾走する姿がよく描かれています。運送会社にリアルタイムで追跡されながら世界中を移動する何百万個もの荷物から、個人ローン、証券取引、政府間取引などのグローバルな決済に至るまで、商品やサービスを世界中で流通させるトランザクションが、今日における世界のビジネス システムを支えています。本日、BigQuery におけるマルチステートメント トランザクションの公開プレビュー版を発表いたします。
BigQuery は長年にわたり、トランザクションあたり 1 つのテーブルに適用される DML ステートメントによる単一ステートメント トランザクション(例: INSERT、UPDATE、DELETE、MERGE、TRUNCATE)をサポートしてきました。マルチステートメント トランザクションは、単一のトランザクションで複数のテーブルにまたがる、DML を含む複数の SQL ステートメントをサポートすることで、その対象範囲を拡大します。つまり、あるトランザクション内のすべてのステートメントに関連する複数のテーブルのデータに対する変更が、成功した場合はアトミックに(すべて一度に)commit され、失敗した場合はすべてアトミックにロールバックされることを意味します。これらの新しいマルチステートメント トランザクション機能は、Mercury がその速さによって人間界と神界をすばやく行き来できたように、オンライン トランザクション処理(OLTP)システムと BigQuery をより緊密かつ高速に統合することで、両者の隔たりを埋めることができます。
概要
トランザクションとは、業務単位を表すデータベースやデータ ウェアハウスに対して実行される一連のタスクのことです。たとえば、注文の迅速化アクションは複数のテーブルに一連の変更をもたらす可能性があります(例: 注文の納期を更新し、迅速な貨物配送を作成するために貨物に新しい出荷ラインを追加し、以前の通常配送の出荷ラインをキャンセル(更新)する)。これに対応して、バッチジョブがデータ ウェアハウスの ETL 処理を実行する際には、複数のテーブルのデータを変換して保存することで、データ ラングリングやデータ クレンジングの操作を行う場合があります。いずれの場合でも、障害の発生時にはトランザクション全体をロールバックして、記録システムに部分的に保存されたデータによってデータセットの不整合を防ぐ必要があります。
トランザクションは、原子性、整合性、独立性、永続性(ACID)プロパティを持つことで知られています。原子性は、すべてのデータ変更(メタデータの変更を含む)が単一の操作で適用または復帰されることを示します。たとえば、ある一揃いの行が拡張によってテーブルに追加されて対応する一揃いの行が削除されるとき、両方の操作が同時に行われます。整合性は、トランザクションが完了する前後におけるデータの整合性を指します。データをテーブルに追加またはテーブルで更新されるときに、テーブルのデータへの変更がテーブルまたはその列に指定された制約と一致していることを示しています。たとえば、データがテーブルに追加されるかテーブルで変更される場合、NOT NULL 制約がコンパイルされます。独立性は、複数のトランザクションが互いに干渉しない限り、テーブルに対して同時に変更を加えられることを示します。たとえば、異なる業務単位からテーブルにデータをロードする 2 つのトランザクションは同時に進行できます。最後の永続性は、おそらく最も重要なトランザクションのプロパティで、障害の発生時(トランザクションを完了した後)に、トランザクションによって commit されたすべての変更が、将来のトランザクションやクエリのために保存されることを保証します。
分離レベル
マルチステートメント トランザクションを含む BigQuery のすべてのトランザクションは、スナップショット分離をサポートします。この分離レベルでは、トランザクション内のすべてのステートメントが、トランザクションの開始時点でのデータベースの一貫したスナップショットを参照します。BigQuery ではこの機能を、一定期間のデータベースへのミューテーション履歴を保持するマルチバージョンのプロパティによって実現します。進行中のトランザクションは、他の同時実行中のトランザクションからの変更(commit、uncommit を問わず)を参照しません。BigQuery は書込み内容の読み込みをサポートしており、トランザクション内のステートメントは、同じトランザクション内の以前のステートメントによって適用されたすべての変更を参照できます。
例
BigQuery が 1 度の操作で複数のテーブルに対して複数の変更を加えるマルチステートメント トランザクションのコンセプトをどのようにサポートするかを示す例を見てみましょう。この例では、100 個のパーティションを持つ 10 個のテーブルを作成することで、このデモを設定します。
次に、BigQuery の新しい COMMIT コマンドと ROLLBACK コマンドによってトランザクションを横断する複数テーブルの変更を保存または逆行する方法を示します。
モニタリングおよび管理
単一の DML コマンドにマッピングされる単一ステートメント トランザクションとは異なり、マルチステートメント トランザクションは、複数テーブルを横断する複数の DML オペレーションにまたがる複雑なものです。これらの複雑なジョブを監視するために、BigQuery JOBS INFORMATION_SCHEMA ビューが拡張され、BigQuery の各トランザクションの一意の識別子を含む新しい列 TRANSACTION_ID が追加されました。これらのビューを照会すると、進行中のトランザクションもしくは完了したトランザクションを照会できます。
トランザクションを終了させるには、トランザクションを含むスクリプトの親ジョブ ID を BQ.JOBS.CANCEL システム プロシージャに渡すことで、トランザクションが実行されている親ジョブを終了させる必要があります。
まとめ
企業がよりリアルタイムな知見に基づく意思決定を加速させる中、マルチステートメント トランザクションは、トランザクション データを BigQuery などの分析データ ウェアハウスに取り込むための重要な実現手段となります。強力な ACID プロパティ、commit とロールバックの完全なトランザクション サポート、実績のあるトランザクション処理のバックボーン上に構築された豊富なモニタリング API および管理 API により、BigQuery をご利用のお客様がこれらの新機能を通じてトランザクションの価値を引き出すお手伝いをします。
-Google Cloud プロダクト マネージャー Jagan R. Athreya
-Google Cloud シニア スタッフ ソフトウェア エンジニア Pavan Edara