【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


    目次