Perl Hackers Hub

第30回データベースプログラミング入門―汎用インタフェースDBIと、O/RマッパTengの使い方(1)

本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーはkarupaneruraこと佐藤健太さんで、テーマは「データベースプログラミング」です。

本稿のサンプルコードは、WEB+DB PRESS Vol.84のサポートサイトから入手できます。

なぜデータベースを使うのか

データベースと一口に言ってもさまざまなものがありますが、単にデータベースと言った場合RDBMSRelational Database Management Systemを指すことが多いでしょう。RDBMSは最も一般的かつ、最も基本的なデータベースです。筆者はデータベースプログラミングを学ぶ際はまずRDBMSについて学ぶべきだと考えており、本稿もRDBMSを扱ったプログラミングについて解説していきます。また本稿は、全体を通してMySQLを扱うことを前提とします。

データベースの必要性

まずはそもそもなぜデータベースが必要なのかを考えていきましょう。

単にデータを永続化するためだけであればさまざまな手段があります。たとえば、直接ファイルを操作してデータを読み書きすることもできるでしょう。しかし、この方法ではすぐに多様な問題にぶつかります。実用的なアプリケーションを作るためには、次のような問題を解決する必要があるでしょう。

  • ネットワーク越しにデータを共有できない
  • 並列で行われるファイル操作に対して整合性を保つことが難しい
  • 並列で行われるファイル操作を効率良く直列化できない
  • 長時間かかる処理において、全体で一貫性のあるデータを読み取ることが難しい
  • 変更を安全に巻き戻すことができない
  • データ量に比例して検索が遅くなる

上記の問題をすべて解決した実装を作ることは容易ではありません。しかし既成のデータベースシステムを利用することにより、上記の問題のほとんどについて考えなくてよくなります。特にRDBMSはACID(Atomicity:不可分性、Consistency:一貫性、Isolation:独立性、Durability:永続性)の考え方をベースに設計されているため、RDBMSを利用することにより正確なデータ操作が容易になります。

トランザクションの効用

データベースを利用する大きな理由の一つとして、トランザクションの存在が挙げられます。以下は簡略化した銀行の振り込み処理の一例です。これをもとに考えていきましょう。

① 口座Aの残高を1,000減らす処理
UPDATE account
    SET dollar = dollar - 1000
    WHERE name = "A";
② 口座Bの残高を1,000増やす処理
UPDATE account
    SET dollar = dollar + 1000
    WHERE name = "B";

処理が実行される前にプログラムが停止してしまうと、本来移動すべきお金が消失することに気づきましたでしょうか。処理と処理の順序を逆にしても、今度は本来存在しないはずのお金が残高に加算されてしまいます。つまり、どちらの処理も同時に行われなければデータの整合性が崩れてしまいます。

このようなときにトランザクションが活躍します。トランザクションは処理単位を定義するものです。次のように処理の開始点と終了点をデータベースに知らせることで、データベースは複数の処理が一度に行われたかのように処理してくれます。

ここからトランザクションを開始
BEGIN WORK;
口座Aの残高を1,000減らす処理
UPDATE account
    SET dollar = dollar - 1000
    WHERE name = "A";
口座Bの残高を1,000増やす処理
UPDATE account
    SET dollar = dollar + 1000
    WHERE name = "B";
ここまでが1つの処理単位
COMMIT;

このようにすれば、途中で失敗した場合、すべての変更をもとに戻すことができます。つまり、中途半端に処理が実行されてしまうことを防げるのです。

ほかにもトランザクションを利用することでさまざまな恩恵を受けることができます。トランザクションなどデータベースについてより詳しく知りたい人には、Webエンジニアのためのデータベース技術[実践]入門注1が丁寧に解説されておりお勧めです。ぜひ、一度読んでみてください。

<続きの(2)こちら。>

おすすめ記事

記事・ニュース一覧