Cloud Spanner のトランザクションを徹底解説!

Google Cloud

2024.11.1

Topics

はじめに

こんにちは、Koo です。
前回の記事で紹介した Cloud Spanner の「トランザクション」について徹底解説します。
多くの企業は、グローバル規模でデータを運用しながら、データの一貫性信頼性を維持するという大きな課題を抱えています。
特に複数の地域にまたがる分散環境では、データを安全かつ安定的に管理することは容易ではありません。
Cloud Spanner は、このような問題を解決するために登場した特別なデータベースです!
そこで今回の記事では、Cloud Spanner のトランザクションについてお話ししたいと思います。
ぜひ、最後までご覧ください!

Cloud Spanner とは

Cloud Spanner の料金などの基本的な概要を知りたい方は、こちらの前回の記事もご覧ください。

【初心者向け】Cloud Spanner を触ってみましょう!

トランザクションとは

トランザクションとは、データの信頼性を保障するための「1つの作業単位」を指します。
すべての作業が完了するか、または何も変更されないかのどちらかを保証し、データベースの一貫性を保つ役割を果たします。

たとえば、銀行口座の振替作業がわかりやすい例です。
口座 A から口座 B にお金を移す場合の手順は、
「A からお金を引き出す」 → 「B にお金を加える」の2ステップで行われます。
もし最初のステップだけ成功し、2番目が失敗したら、口座の残高が一致せず問題が発生します。
トランザクションは、こうした問題を防ぐために、すべてが成功すれば作業を完了し、一部でも失敗すれば全体を取り消す(Rollback)ように設計されています。

これを「ACID」特性といいます。

■ 原子性(Atomicity)
トランザクションは1つの単位として扱われます。全部成功するか全部失敗します。
映画撮影で一場面を撮るように、すべての作業が完璧に終わってこそ次の場面に移ることができるようです。
■ 一貫性(Consistency)
トランザクションが完了した後、データベースは一貫した状態を維持します。
データの整合性が保証されるものです。
■ 隔離性(Isolation)
複数のトランザクションが同時に実行されても、お互いの作業に影響を受けません。
各トランザクションが独立した空間で実行されるイメージです。
■ 持続性(Durability)
いったん完了したトランザクションのデータは永続的に保存され、システム障害が発生してもデータが失われることはありません。

なぜトランザクションは重要?

(1) データの安定性

トランザクションのおかげで、データベースのデータが常に正確に保たれます。
処理の途中で問題が発生しても、トランザクションによりデータが混乱することなく、すべての作業が取り消されるか完全に処理されます。

(2) 複雑な作業処理

複数の作業を1つのトランザクションにまとめて処理することで、複雑なタスクを安全に実行できます。
たとえば、ショッピングモールで商品を購入するときに、注文情報を保存し、在庫を差し引くタスクを1つのトランザクションとして処理し、データの一貫性を維持します。

(3) 高可用性

システムに障害が発生しても、データの損失を防ぎ、サービスを迅速に回復することが可能です。

トランザクションの種類

Cloud Spanner は、さまざまなニーズに対応するために複数のトランザクションタイプを提供しています。トランザクションの目的に応じて最適な方法でデータにアクセスし、データの一貫性やパフォーマンスを保ちながら処理することが可能です。
Cloud Spanner のトランザクションの種類を4つご紹介します!

■ 読み取り / 書き込みトランザクション (Read-Write Transaction)

  • 最も一般的なトランザクションタイプには、データの読み取りと書き込みのすべてのタスクが含まれます。
  • データの一貫性を確保するためにロックを使用します。つまり、あるトランザクションが特定のデータを修正している間、別のトランザクションはそのデータにアクセスできません。
  • 強力な一貫性を保証しますが、ロックによりパフォーマンスが多少低下する可能性があります。

■ 読み取り専用トランザクション (Read-Only Transaction)

  • データを読み取るだけのトランザクションで、ロックを使用していないため、パフォーマンスが非常に優れています。
  • 特定の時点のデータを一貫して照会するのに適しています。
  • たとえば、リアルタイムのダッシュボードにデータを表示したり、過去のデータを分析したりする場合に役立ちます。

■ パーティション化された DML(Partitioned DML)

  • 大量のデータを効率的に更新または削除するために使用されます。
  • データを複数のパーティションに分けて並列処理するため、パフォーマンスが非常に優れています。
  • 大規模なデータベースでデータを一括処理する必要がある場合に便利です。

■ トランザクション表

トランザクションの種類 特徴 主な使用シナリオ
読み取り / 書き込みトランザクション 強力な一貫性、ロックを使用 金融取引、注文処理、在庫管理などデータの正確性が非常に重要なシステム
読み取り専用トランザクション 高い性能、ロック未使用 リアルタイムダッシュボード、データ分析、
ログ照会など
パーティション化された DML 大量データ処理、高性能 データ移行、データ整理、バッチ処理など

参考:トランザクションの概要

トランザクションの特徴

Cloud Spanner は分散環境でのトランザクションを可能にするため、いくつかの独自技術を活用して一貫性と信頼性を確保しています。
Cloud Spanner がデータの整合性を分散環境でどのように実現しているかを紹介します!

(1) 外部整合性

Cloud Spanner は「ACID」特性を世界中に分散した環境でも完璧に保障します。
複数の地域にデータを複製して保存するため、特定の地域で障害が発生してもサービスが中断されることはありません。しかし、このような分散環境でトランザクションを管理することは容易ではありません。
各地域のデータを一貫して保持する必要があるからです。Cloud Spanner は、この問題を解決するために次のような技術を使用します。

■ TrueTime API による同期

TrueTime API は、Google のグローバルインフラを活用して、すべてのデータセンターの時計をミリ秒単位で非常に正確に同期します。
これにより、各トランザクションが分散された環境でも同じタイムスタンプを基に実行され、データの整合性が確保されます。

■ Paxos : 分散合意アルゴリズム

TrueTime API が正確な時間を提供するなら、Paxos はすべての地域のデータセンターがトランザクションの結果に同意するようにするアルゴリズムです。
各データセンターはトランザクションの内容に投票し、過半数以上の同意を得なければトランザクションはコミットされません。まるで会議で決定を下すようです。
すべての参加国(データセンター)が同意してこそ、決定が最終的に確定するのです。
Paxos はこの過程でデータの一貫性を保障します。
1つのデータセンターに障害が発生しても、別のデータセンターがトランザクションを完了できます。

参考:Spanner: TrueTime と外部整合性

(2) ロックモードと競合

Cloud Spannerは、分散された複数のリージョン間でデータの一貫性と完全性を保つために、さまざまなロックモードを使用します。
これらのロックモードは、トランザクション間およびリージョン間での衝突を防ぎ、効率的な同時実行をサポートします。

■ ReaderShared

読み取り-書き込みトランザクションがデータを読み取る際に取得するロックです。
このロックにより、複数のトランザクションが同時に同じデータを読み取ることができますが、リージョン間でのデータの一貫性を確保するために書き込み操作は制限されます。
たとえば、東京リージョンでこのロックがかかっているとき、他のリージョンで同時に読み取ることは可能ですが、書き込みは制限されます。こうして、データの読み取りが安全に行われます。

■ WriterShared

データの読み取りなしで書き込みのみを行うトランザクションが取得するロックです。
このロックを使用すると、リージョン間のトランザクションは安全にデータを修正でき、他のリージョンの読み取り操作は可能ですが、追加の書き込みは制限されます。
たとえば、東京リージョンでのデータ書き込みがロックされている場合、ソウルリージョンでの同じデータへの追加の書き込みは制限され、データが重複したり矛盾することを防ぎます。

■ Exclusive

ReaderShared ロックを保持するトランザクションがデータを修正する際に取得する特別なロックです。
このロックにより、他のリージョンのトランザクションが同時にアクセスできないようになり、データの完全性が保たれます。
たとえば、東京リージョンで Exclusive ロックを取得すると、他のリージョンのトランザクションがそのデータにアクセスできないため、データが安全に更新されます。

■ WriterSharedTimestamp

新しい行を挿入するときに取得する特殊なロックで、コミットタイムスタンプをキーの一部として使用します。
このロックは、リージョン間でタイムスタンプの一貫性を保つため、他のリージョンが同じタイムスタンプでデータを挿入しようとした場合に制限がかかります。
たとえば、東京リージョンで特定のタイムスタンプでデータが挿入された場合、ソウルリージョンでは同じタイムスタンプでの挿入が防がれ、データの重複や矛盾が避けられます。

■ ロックモード間の競合関係表

ReaderShared WriteShared Exclusive WriterShared Timestamp
ReaderShared 競合しない 競合する 競合する 競合する
WriteShared 競合する 競合しない 競合する 該当なし
Exclusive 競合する 競合する 競合する 該当なし
WriterShared
Timestamp
競合する 該当なし 該当なし 競合する

参考:ロックの統計情報

※各ロックについてリージョンを例として説明いたしましたが、リージョンが何か知りたい方はこちらの記事をご覧ください。

Cloud Spanner のリージョンを徹底解説!

まとめ

今回紹介したように、Cloud Spanner のトランザクション機能は、データの一貫性と高い信頼性を分散環境で実現する強力なツールです。
ぜひトランザクションの理解を深め、より安定したシステム運用に役立てましょう!
最後までお読みいただきありがとうございました!

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

Koo

2024年新卒入社。
料理と音楽が好きなデータベースエンジニアです。 MySQL と Google Cloud、特に Cloud Spanner への関心が高いです。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら