【ACID特性】データベースはなぜ必要?4つの特性が示す大事なこと

what-is-database

データベース(DataBase:DB)。システム開発に必ずといっていいほど登場する、重要な要素です。

データベースは「データを保存しておくところ」のイメージです。でも保存するだけなら、ファイルに保存すればいいんじゃない?なぜそんな仰々しいものが必要なの?

もちろん、データベースには存在の理由があります。そのカギとなる考えが「ACID(アシッド)特性」です。

目次

なぜDBが必要なのか

まずは、なんでDBがいるのか?ファイルに保存するだけじゃなぜダメなのか?を考えましょう。

大事な考えかた「トランザクション」

DBの必要性を考えるうえで、まず重要な考え方が、トランザクション

トランザクション

トランザクション:データの変更を完了させる一連の操作

例えば「個人間送金」。山田さんが鈴木さんに¥300送るなら、データベース操作は次のとおり。

データベース操作
  1. 山田さんの残高から、¥300を引く
  2. 鈴木さんの残高に、¥300を足す

このとき、途中の「山田さんの残高から¥300引く」で終わってしまうと困ります。この操作は、、両方が完了することでトランザクション終了、となるわけです。

トランザクションは、データを「確実に」「正しく」「矛盾なく」管理するために必要な考え方です。

DBは、大量データへの複数アクセスをさばく

DBが必要な理由。それは、以下のようなシチュエーションの場合に必要だから。

データベースが必要なとき
  • 大量のデータへの
  • 複数のアクセスを
  • 同時にさばく

大量のトランザクションが同時に発生しても、矛盾を起こさないこと、が重要です。これがDBの重要な役割です。

DBが持つべき4つの特性

トランザクションで矛盾を生じさせないために、DBが持つべき特性。それがACID特性です。

ACID特性とは、以下の4つの特性のことをいいます。頭文字4つを取って、ACIDですね。

DBが持つべきACID特性
  • Atomicity(原子性)  中途半端に終わらないこと
  • Consistency(一貫性) 結果に矛盾が起こらないこと
  • Isolation(独立性)   他に影響を与えないこと
  • Durability(永続性)  結果が失われないこと

単にファイルをデータに保存する、というだけだと、この特性を保つのは困難です。

DBは、ACID特性を保つために必要になるのです

ACID特性とはなにか

DBが持つべき、ACID特性。なにが実現できればよいのでしょう?

スマホ決済での、個人間送金機能の例を考えましょう。

スマホ決済データベース

残高テーブル

ユーザー残金
山田 太郎¥3,000
鈴木 一郎¥1,200
高橋 次郎¥0

原子性(Atomicity)

トランザクションは、すべて実行されるか、あるいはなにも実行されないか、のどちらかである必要があります。

個人間送金で、山田さんの残高から¥300を引く、で終わってしまったら、おかしなことになりますね。

トランザクションを確定させる操作を「コミット」、なかったことにする操作を「ロールバック」といいます。DBの更新操作は、このいずれかで完了することになります。

一貫性(Consistency)

データは一貫したルールを保つ必要があります。ルールにそぐわないトランザクションは実行できません

高橋さんの残高¥0なのに、誰かに送金できるのはおかしいですね。この場合はトランザクションを中止します。

独立性(Isolation)

複数のトランザクションが同時発生したとき、あるトランザクションの途中経過は、他のトランザクションからは見えません

山田さんから鈴木さんに送金している間に、同時にほかの誰かが送金しようとした場合、

  • 送金する前
  • 送金した後

のどちらかの状態でしか見えません。途中の状態は見えないわけですね。

永続性(Durability)

トランザクションが完了したら、その結果は失われません。

送金が完了したら、山田さんの残高も、鈴木さんの残高も、送金完了後のものになります。これは当然そうですね。

ACID特性で、複数/同時トランザクションの整合性を担保する

ここで見たのは「山田さんが鈴木さんに¥300送る」という1つのトランザクションだけ。

でも実際には、スマホ決済を使う人がたくさんいます。たくさんの人が同じ時刻に送金操作をします。複数トランザクションが同時に発生することになります。

複数のトランザクションが同時に発生しても、ACID特性が保たれていれば、矛盾なく正しく管理することができるわけです。

DBMSが、ACID特性を実現する

DBはACID特性を持つことが重要です。そして、これを実際に実現するのは、データを管理しているプログラム、DBMS(DataBase Management System)です。

いろいろなDBMS

DBMSにもいろいろあります。よく聞くのは以下でしょうか。

おもなDBMS
  • Oracle(オラクル)
  • MySQL
  • PostgreSQL(ポストグレSQL)

これらのDBMS、違いはどこにあるのでしょうか。

DBMSの違いは、ACID特性と性能の両立具合

トランザクションのACID特性を保つDBMS。でも、ACID特性を完璧に実現するのは、実はかなり難しいのです。ロック、2フェーズコミット、トランザクションログ…DBMSは、いろいろな技術で実現しようとしています。

さらに、ACID特性を保つときに問題となるのは、性能です。

トランザクション数が増加したとき、ACID特性を守ろうとするほど、性能(検索や登録の速度)は劣化します

ACID特性と性能を、どこまで高水準で両立させるか。DBMSの違いはここにあります。

主要なDBMSの違い

よく知られるDBMSの違いを簡単に説明してみましょう。

名称特徴
Oracle開発会社はオラクル社。DBMSの名前もオラクル。
業界随一の堅牢性と性能をあわせもつ、最強のDBMS。有償。お高い。
MySQLオープンソースであるが、商用にひけをとらない高性能。採用事例も多い。
人気のWeb環境LAMP(Linux、Apache、MySQL、PHP)の一角。提供元はオラクル。
PostgreSQLポストグレSQL。通称ポスグレ。オープンソース。SQL標準規格への対応度高い。
追記型アーキテクチャが特徴(削除するときに実際に削除しない)
SQL Serverマイクロソフトが開発するDBMS。マイクロソフトなのでWindowsサーバと相性が良い
.NETアプリケーションで開発しやすい。
MariaDBMySQLから途中で分離したDBMS。
なのでMySQLと似ているが、最近は独自の発展を遂げている。
SQLite軽量でコンパクトなDBMS。インストール不要、データファイルあればいいなどお手軽
小規模システム向き。DB練習用としてもいい。
MongoDBリレーショナルデータベースではなく、NoSQLと呼ばれるジャンル。
RDBのように厳密な定義をしなくても使える柔軟さで人気。
DBMSの種類

どれがいい/悪いというわけではなく、求められる状況に応じて使い分けることが大事です。

DBアクセスの実装方法

DBMSを使うプログラムは、実際どのように作るのでしょうか。

PHPでMySQLを使う例:

<?php
// MySQLサーバーへの接続情報
$host = 'localhost'; // ホスト名
$username = 'ユーザー名'; // ユーザー名
$password = 'パスワード'; // パスワード
$database = 'データベース名'; // データベース名

// MySQLへの接続
$mysqli = new mysqli($host, $username, $password, $database);

// 接続エラーの確認
if ($mysqli->connect_error) {
    die('接続エラー (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}

// クエリの実行
$query = 'SELECT * FROM users';
$result = $mysqli->query($query);

// 結果の取得
if ($result) {
    // 取得したデータの処理
    while ($row = $result->fetch_assoc()) {
        echo 'ID: ' . $row['id'] . ', Name: ' . $row['name'] . '<br>';
    }
    
    // 結果セットの解放
    $result->free();
} else {
    echo 'クエリエラー: ' . $mysqli->error;
}

// MySQLからの切断
$mysqli->close();
?>

多くの言語では、ACID特性を気にせず使えるような、DB用のAPIが準備されています。

どの言語でどのDBMSを使うときも、だいだい以下の手順になります。

DBを使うプログラミングの処理手順
  1. データベースサーバに接続する
  2. SQLを発行する
  3. (更新した場合は)コミットもしくはロールバックする
  4. データベースサーバを切断する

DBMSはACID特性をどう実現するか

このとき、ACID特性は実際にはどう実現されているのでしょう?

DBMSが実現するACID特性
  • Atomicity(原子性)  コミットしたらトランザクション有効、ロールバックしたら無効
  • Consistency(一貫性) テーブル定義に制約を設ける。制約違反の操作をしたら失敗とする
  • Isolation(独立性)   コードが複数個所で同時に実行されても、DBMSが矛盾のないように管理する
  • Durability(永続性)  操作した結果はDBMSが記録する

DBMSの機能により、ACID特性を気にせずにコーディングをすることができるわけです。

ただし前述のとおり、実際にどこまでACID特性が担保されるかは、使うDBMSによって違うことに注意しましょう。

まとめ

「大量データへの複数アクセスを同時にさばく」それが、DBの大事な役割です。

DB設計を疎かにすると、「想像以上のアクセス量で性能が出ない…」という問題が、最後の最後で発生します。そして重大な問題になってしまうのです。

DBの知識を正しく身に着けて、後で問題が起こらないようにしましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次