【入門編】 読み取り専用トランザクション最適化 – Cloud Spanner

こんにちは!Cloud Spannerの世界へようこそ。
チーフアーキテクトの私です。

「Cloud Spannerって名前はカッコいいけれど、なんだか難しそう……」
「普通のデータベースと何が違うの?」

そんな風に思っていませんか?大丈夫、安心してください。今日は、Cloud Spannerの数ある武器の中でも、特に強力で日常のシステム開発でめちゃくちゃお世話になる「読み取り専用トランザクション(スナップショット読み取り)」について、専門用語をできるだけ使わずに、私の直伝のたとえ話を交えて徹底的に解説します。

ここをクリアすれば、Cloud Spannerの基本はバッチリマスターできますよ!それでは、いってみましょう。

—

1. なぜ「読み取り」で頭を悩ませるのか?(現実世界でのたとえ)

想像してください。あなたは超人気テーマパークの「公式ガイドマップ」の在庫管理スタッフです。
毎日、何万人ものゲスト(ユーザー)が、アプリで「今、このアトラクションの待ち時間は何分?」とデータを見ています。

もし、この「待ち時間を見るだけ(=データの読み取り)」の人たち全員に対して、スタッフが「ちょっと待って!今このノートに書き込み中だから、誰も見ちゃダメ!」と鍵(ロック)をかけてしまったらどうなるでしょうか?

……園内は大パニックですよね。「情報を見たいだけなのに、なんで待たされるんだ!」と大クレームになります。

従来の一般的なデータベースは、データを安全に保つために、この「見るだけの人」に対しても一時的に鍵をかけたり、お互いの邪魔をし合ったりすることがありました。これが、システムが重くなる大きな原因だったのです。

—

2. Cloud Spannerの魔法:「タイムマシン写真」の正体

ここで登場するのが、Cloud Spannerの読み取り専用トランザクション(スナップショット読み取り)です。

Cloud Spannerは、いわば「パーフェクトなタイムマシンカメラ」を持っています。
データを読み込むとき、データベース全体に鍵をかける……なんて野暮なことはしません。その代わり、こう言います。

> 「〇月〇日 12時00分00秒時点の、世界の一瞬を切り取った『写真』をあげるね。この写真はもう変わらないから、ゆっくり見ていっていいよ!」

これがスナップショット読み取りの本質です。
データを書き込んでいる人(スタッフ)の邪魔を一切せず、過去のある一瞬の「完璧に一貫性の取れた状態のデータ」を、ロックなし(待たされずに)でスパッと取得できるのです。

  • 書き込みの邪魔をしないから、システムが遅くならない。
  • 鍵をかけないから、何万人が同時にアクセスしても絶対に渋滞しない。

これが、世界中の巨大なシステムがCloud Spannerを選ぶ理由の一つです。

—

3. 実践!「過去の一瞬」を切り取るスマートなクエリ

百聞は一見にしかず。実際にコードを書いて、このスナップショット読み取りを体験してみましょう。

Cloud Spannerで読み取り専用トランザクションを使うときは、「この瞬間のデータが欲しい」という指定(あるいはシステムにおまかせする設定)を行います。

以下は、あるユーザーの残高データを安全かつ高速に読み出すコードの例です。(Pythonをベースにしたイメージで書いています)

from google.cloud import spanner

クライアントの初期化
client = spanner.Client()
instance = client.instance(“my-instance”)
database = instance.database(“my-database”)

読み取り専用トランザクションをスタート!
「ロックは一切かけないで、安全なスナップショットをちょうだいね」と指示します
with database.snapshot() as snapshot:

# ユーザーの残高データを取得するSQL
# スナップショットのおかげで、他の人が書き込み中でも待ち時間ゼロで取得できます
query = “SELECT user_id, balance FROM Accounts WHERE user_id = @user_id”
params = {“user_id”: “user_12345″}

result = snapshot.execute_sql(query, params=params)

for row in result:
print(f”ユーザーID: {row[0]}, 残高: {row[1]}円”)
# ここで行っている読み取りは、世界がどれだけ忙しくても
# 他の処理をブロック(邪魔)しません!

コードのポイント

  • `database.snapshot()` が、まさに「タイムマシンカメラのシャッター」を切る瞬間です。
  • この中で実行されるSQLは、他の書き込み処理とケンカをしません。「読む人は読む、書く人は書く」が完全に並行して行えるため、圧倒的なパフォーマンスを発揮します。

—

4. チーフアーキテクトからの実務アドバイス

さて、このスナップショット読み取り、実務ではどんな場面で使うのが正解でしょうか?

結論から言うと、「データの更新(書き込み)を伴わない処理は、すべて読み取り専用トランザクション(スナップショット)に寄せる」のが鉄則です。

  • マイページの残高・プロフィール表示
  • ECサイトの商品一覧や詳細ページの表示
  • 裏側で行う重いデータ集計やレポート出力

これらはすべて「見たいだけ」の処理です。ここに通常のトランザクション(ロックを使うもの)を使ってしまうと、システムのポテンシャルをドブに捨てるようなものです。もったいない!

「データを変更しないなら、迷わずスナップショット!」
これを合言葉にするだけで、あなたの作るシステムの安定性とスピードは劇的に向上します。

—

おわりに

いかがでしたでしょうか?
Cloud Spannerの読み取り専用トランザクション(スナップショット読み取り)は、難解な理論ではなく、「みんながストレスなくデータを見られるようにする優しい工夫」なんだと感じていただけたなら嬉しいです。

この基本さえ押さえておけば、Cloud Spannerの強みの半分はもうあなたのものです。
明日からの設計やコーディングで、ぜひこの「ロックしない贅沢」を味方につけてみてくださいね。

それでは、また次のアーキテクチャの旅でお会いしましょう!

コメント

タイトルとURLをコピーしました