見出し画像

【SQL・DB特別編】データ消失の悲劇を防げ!エンジニアの命綱「トランザクション」とは

「データベース・SQL」シリーズをいつも読んでいただき、ありがとうございます!

入門編・基礎編を通して、データの操作から美しいデータベースの設計方法まで、実務で使える一通りのスキルをマスターしてきました。

今回は、通常の連載からは一歩踏み込んだ「特別編」をお届けします。

テーマは、システム開発やバックエンドの世界で絶対に避けては通れない、超・重要概念「トランザクション」です。

プログラミング初心者の方にとっては、少し聞き慣れない言葉かもしれません。しかし、もしあなたが普段使っている銀行のアプリや、オンラインゲーム、ECサイトでこの「トランザクション」の仕組みがなかったら、私たちの預金やゲームのデータは一瞬で消滅し、大惨事になってしまうのです。

一体、データベースの裏側でデータはどのように守られているのか?

エンジニアの命綱とも言える、その安全装置の仕組みをサクッと紐解いていきましょう!


1. 「途中でエラーが起きたらどうする?」という問題

トランザクションとは、一言でいうと「データベースに対する、これ以上分けられない『一連の処理のまとまり』」のことです。

これだけだと抽象的なので、一番わかりやすい「銀行の振り込みシステム」を例に考えてみましょう。

あなたが、友人のAさんにスマホアプリから「1万円」を振り込むとします。

このとき、銀行のデータベースの裏側では、最低でも以下の2つのステップ(SQL)が同時に実行されます。

  1. あなたの口座から1万円を引き算する(UPDATE文)

  2. Aさんの口座に1万円を足し算する(UPDATE文)

-- ① あなたの口座から10,000円を引く
UPDATE KOUZA SET ZANDAKA = ZANDAKA - 10000 WHERE USER_ID = 'YOUR_ID';

-- (ここで、もし予期せぬシステムエラーや停電が起きたら…?)

-- ② Aさんの口座に10,000円を足す
UPDATE KOUZA SET ZANDAKA = ZANDAKA + 10000 WHERE USER_ID = 'A_ID';

普通に動けば何も問題はありません。しかし、もしシステムが「① あなたの口座から引き算」を終わらせた直後に、突然のサーバーダウンや通信エラーで強制終了してしまったらどうなるでしょうか?

あなたの口座からは1万円が消えたのに、Aさんの口座には1万円が届いていない。

つまり、「世の中から1万円が完全に消滅した」ということになります。これは大問題ですよね。


2. トランザクションの魔法「COMMIT」と「ROLLBACK」

このような「データが中途半端な状態で保存されてしまう悲劇」を防ぐために、データベースには「全部成功させるか、さもなくば、最初から何もなかったことにするか」のどちらかしか選べない強力なルールが存在します。

この処理のまとまりをコントロールするのが、以下の2つの呪文です。

① COMMIT(コミット):すべて成功したから確定!

一連の処理がすべて無事に完了したら、最後に COMMIT; というコマンドを実行します。

これを行うことで初めて、変更されたデータがデータベースに「永久に保存」され、他の人からも見えるようになります。

② ROLLBACK(ロールバック):失敗したから時間を巻き戻す!

もし、途中のステップで1回でもエラーが発生した場合は、即座に ROLLBACK; というコマンドを実行します。

これを行うと、それまで途中まで書き換えていたデータが全て破棄され、「処理を始める前の状態」に一瞬でタイムリープ(巻き戻し)します。

先ほどの銀行の例で言えば、①の引き算の後にエラーが起きても、自動的に ROLLBACK が走るため、あなたの口座の1万円は元の状態に戻ります。「通信エラーで振り込みに失敗しました」とアプリに表示されるだけで、お金が消えることはありません。


3. 知っておきたい「ACID(アシッド)特性」

この、データを完璧に守るためのトランザクションが持つべき4つの性質の頭文字を取って、インフラの世界では「ACID特性」と呼びます。エンジニアの面接やITパスポート、基本情報技術者試験でも頻出の常識です。

  • Atomicity(原子性):処理は「すべて実行される」か「全く実行されない」のどちらかでなければならない(100か0か)。

  • Consistency(一貫性):処理の前後で、データベースのルール(データ矛盾がないこと)が常に保たれていること。

  • Isolation(分離性):複数の人が同時にデータを書き換えても、お互いの処理が混ざって邪魔をしないこと。

  • Durability(永続性):一度 COMMIT されたデータは、その後にシステムが停電しても絶対に消えないこと。

私たちが普段、何気なくネットショッピングをしたり、ゲームでガチャを引いたり、SNSに投稿したりできているのは、データベースがこのACID特性を必死に守ってくれているおかげなのです。


まとめ

特別編の今回は、システムの安全性を担保する裏側の仕組みについて学びました。

  • トランザクションは、これ以上分けられない複数の処理のひとまとまり。

  • 成功時は COMMIT でデータを永久確定。

  • 失敗時は ROLLBACK で最初から何もなかったことにする(データのタイムリープ)。

  • データを守るための4つの絶対ルールが 「ACID特性」

普段SQLのコードを書いているときにはあまり意識しないかもしれませんが、Webアプリやゲームのバックエンドを開発するようになると、このトランザクションの設計がシステムの命運を分けます。

「データベースの裏側では、こんな風に安全装置が働いているんだな」という仕組みが、頭の片隅に知識の資産として残っていれば幸いです!


いいなと思ったら応援しよう!

人生ライブラリ よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!