データベースの基礎【トランザクションとACID特性】

今回は僕がデータベーススペシャリストの勉強をして、

重要だと感じたトランザクションとACID特性について具体例を挙げながらまとめました。

データベーススペシャリストを目指している方にはもちろん、

普通のシステムエンジニアやプログラマーにも抑えておいて欲しい内容です。

この記事を書いている僕はシステムエンジニア6年目

普段はJavaでWebアプリを作ったりSQL書いたり・・・(DBAのような仕事は普段していないです)

応用情報技術者試験に合格(2回落ちましたが。。)し、データベースの分野が得意だったので、

独学でデータベーススペシャリストの勉強をして、昨年合格(これは1発合格)しました。

今回は、データベーススペシャリストの勉強を通じて、

データベーススペシャリストを目指す人はもちろん、

普通のシステムエンジニアやプログラマーの方にも抑えておいて欲しい

正規化不足の時に発生する更新時異常についてまとめてみました。

トランザクションとACID特性

OracleやPostgreSQL、MySQLなどはDBMS(DataBase Management System)と呼ばれ、

これらDBMSにはデータを更新している最中に障害が発生しても、

データに矛盾が起こらないようにするトランザクション管理機能を持っています。

っといきなり言われても、、、ですかね。。

まずはトランザクションとは何かについて確認していきます。

トランザクションとは

ひとまずトランザクションのイメージを掴むために以下の図を見てください。

ピンクの矢印の部分がトランザクションになります。

つまり、山田さんから見た口座振込の処理がトランザクションです。

このトランザクションにはACID特性といわれる、

トランザクションに求められる4つの特性があります。

この特性について見ていきましょう。

ACID特性とは

ACID特性とは次の4つの性質の頭文字をとったもので、

この特性を持つことによってトランザクションの信頼性が得られます。

原子性(Atomicity)

「トランザクションは、完全に実行されるか全くされないかのどちらかでなければならない。」

これは以下の例をイメージすると分かりやすいと思います。

上記の絵のように「山田さんの口座から3万円引く」処理は成功して、

「田中さんの口座に3万円足す」処理が失敗した場合、、、

トランザクションを中途半端な状態(山田さんの口座から3万円引かれた状態)で終了させない特性が原子性です。

中途半端な状態で終了させないとは、、

処理が失敗したら処理1実行前の状態に戻し、処理が成功したら処理2まで完了した状態にすることを意味します。

この特性を実現するためにDBMSではコミットメント制御機能があります(機能の詳細は別の記事で説明します)。

一貫性(Consistency)

「トランザクションは、データベース内部で整合性が保たれなければならない。」

これは以下の例をイメージすると分かりやすいと思います。

このようなマイナスの値を許容しないような制約を予め定めておいて、

制約違反させないようにデータを管理させる性質が一貫性です。

独立性(Isolation)

「トランザクションは、同時に実行している他のトランザクションからの影響を受けず、

並行実行の場合も単独で実行している場合と同じ結果を返さねばならない。」

これは以下の例をイメージすると分かりやすいと思います。

上の例では山田さんの振込失敗(残高10万円のまま)で、

斎藤さんからの3万円振込成功なので山田さん口座は13万円になるべきですが、、

トランザクション実行途中の状態を参照したせいで山田さん口座は10万円になってしまいました。

このようにトランザクション実行途中の状態を別トランザクションから参照されない性質が独立性です。

この特性を実現するためにDBMSでは排他制御御機能があります(機能の詳細は別の記事で説明します)。

耐久性(Durability)

「トランザクションの結果は、障害が発生した場合でも、失われないようにしなければならない。」

これは保存しているデータはシステムに障害が発生したり、ディスクが壊れても、

障害発生直前の状態に復旧できる性質です。

この特性を実現するためにDBMSでは障害回復機能があります(機能の詳細は別の記事で説明します)

まとめ

今回はトランザクションとトランザクションのACID特性について確認しました。

データベーススペシャリストの試験の午前問題ではACID特性のCは何の特性?のような問題が出たり、

午後問題では独立性の特性が欠落しているトランザクション同士を同時に実行させて何が起きるか??

また、どのように改善すべきか??などなど問われることがあります。

また、現場でシステム開発をする際、

トランザクションのACID特性については意識して実装すべきです。

基本的なことですが、今回の内容は確実に抑えておくべきだと思います!!

2022/03/21追記

現場で必要なデータベース周りの知識に関するまとめ記事を作ったので

是非そちらも参照ください!!

現場で役立つデータベースの基礎知識まとめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください