【入門編】 トランザクションの種類 – Cloud Spanner

やあ。Cloud Spannerという、とてつもなく強力で、かつ少しだけ奥深い「データベース界の巨人」の世界へようこそ。

多くの人はSpannerを「ただの巨大なデータベース」だと思っているけれど、それは宝の地図をただの紙切れだと言っているようなものだ。君が今から学ぼうとしているのは、「世界中のどこからアクセスしても、常に正確なデータが整列して待ってくれている」という、魔法のような仕組みの心臓部だよ。

今日は、Spannerを操るための「3つの魔法(トランザクション)」について、日常の例えを交えながら紐解いていこう。ここさえ押さえれば、君はもうSpannerの基本をマスターしたと言っても過言じゃない。

—

1. 読み取り専用トランザクション(Read-only Transaction)

〜「図書館の本棚を眺めるだけ」の安心感〜

想像してみてほしい。君が図書館に行き、棚に並んでいる歴史書を眺めているとする。君が本を読んでいる間、他の人がその本を書き換えることはないし、君自身も本に書き込みはしない。

これが「読み取り専用トランザクション」だ。

  • 何がすごいのか: 何も書き換えないという約束があるから、Spannerは君に最も近い場所(あるいは一番空いている場所)から、爆速でデータを渡してくれる。
  • 使い時: 「最新の状況をただ知りたいだけ」のとき。例えば、ユーザーのプロフィール画面を表示したり、過去の注文履歴を一覧で見たりするときだね。

2. 読み書きトランザクション(Read-write Transaction)

〜「銀行の窓口で送金する」重厚な儀式〜

今度は銀行の窓口に行こう。口座からお金を引き出し、誰かに送金する。このとき、もし途中で誰かが口座残高を勝手に変えてしまったら大惨事だよね。

Spannerはこれを防ぐために「厳重なロック」をかける。

  • 何がすごいのか: 読み取りと書き込みをセットで行い、処理が完了するまで他の人はそのデータに触れさせない。これが「一貫性」を守るためのSpannerの真骨頂だ。
  • 使い時: データの値を更新したいとき。残高の変更、在庫の減算など、「今の状態を確認し、その結果をもとに書き換える」必要があるときだ。

3. パケット化された読み取り(Partitioned Read)

〜「大勢のスタッフで一気に全巻チェック」〜

最後は少し特殊なやつだ。図書館の本を1冊ずつ読むのではなく、100人のスタッフを雇って、全員で分担して図書館の全蔵書を1分でリストアップさせるようなもの。

  • 何がすごいのか: Spannerは巨大なデータを小さな断片(パケット)に切り分け、並列で処理する。一人でやるより、大人数で一気に攻めるほうが圧倒的に速いという理屈だ。
  • 使い時: 「数億件ある全データを集計したい」といった、とてつもなく重い処理をするとき。

—

コードで見る「魔法」の使い分け

少しだけコードのイメージを見せよう。Spannerの使い心地は、直感的でとてもエレガントだ。

1. 読み取り専用の例:ただ情報を取得するだけ
def read_only_example(db):
with db.snapshot() as snapshot:
# スナップショットは「ある瞬間の静止画」を見るイメージ
results = snapshot.execute_sql(“SELECT name FROM Users”)
for row in results:
print(row[0])

2. 読み書きの例:確実にお金を動かす
def read_write_example(db):
def update_balance(transaction):
# データを読み込み…
row = transaction.execute_sql(“SELECT balance FROM Accounts WHERE id = 1”).one()
new_balance = row[0] – 100
# 確実に書き込む!
transaction.execute_update(“UPDATE Accounts SET balance = @new_balance WHERE id = 1”,
params={‘new_balance’: new_balance})

# この中で行われる読み書きは、全て「一貫性」が保証される
db.run_in_transaction(update_balance)

—

最後に、君に伝えたいこと

Cloud Spannerは、ただの道具じゃない。「分散システムというカオスな世界で、秩序を守るための守護神」なんだ。

  • 読み取り専用は、速さと平和のために。
  • 読み書きは、データの正しさ(信頼)のために。
  • パケット化された読み取りは、圧倒的な規模(パワー)のために。

この3つを使い分ける感覚が身につけば、君はもうSpannerを恐れる必要はない。むしろ、これほど頼りになる相棒は他にいないと気づくはずだよ。

何か壁にぶつかったら、いつでもここに戻っておいで。エンジニアとしての旅路を、心から応援しているよ!

コメント

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