基本情報のトランザクション処理|ACID特性・排他制御・デッドロック

基本情報のトランザクション処理を学ぶイメージ

基本情報技術者試験のデータベース分野で、トランザクション、ACID特性、排他制御、デッドロックがまとめて出てくると、一気に難しく感じますよね。

ただ、この分野は細かいSQL文を暗記するというより、処理のまとまりを壊さないための考え方を押さえるテーマです。銀行振込、在庫更新、予約システムのように、複数の処理が途中で止まると困る場面をイメージすると理解しやすくなります。

この記事では、基本情報のトランザクションで問われやすいACID特性、COMMITとROLLBACK、共有ロックと占有ロック、デッドロックまでを、選択肢で迷わない形に整理します。

この記事のポイント
  • トランザクションは複数処理をひとまとまりにする仕組み
  • ACID特性は原子性・一貫性・独立性・耐久性で覚える
  • 排他制御は同時更新によるデータ不整合を防ぐ考え方
  • デッドロックは互いにロックを待ち続ける状態
無料

基本情報技術者試験 過去問アプリ

本番形式で繰り返し解ける。スキマ時間に1問から

2,000問以上収録
無料で過去問を解く
目次

基本情報のトランザクションとは

ACID特性とトランザクションの流れ

トランザクションの意味

トランザクションとは、データベースに対する複数の処理を、ひとまとまりの作業単位として扱う仕組みです。基本情報では、銀行口座の振込処理を例に考えると理解しやすいです。Aさんの口座から1万円を引き落とし、Bさんの口座に1万円を入金する処理があるとします。このとき、引き落としだけ成功して入金が失敗すると、データ上のお金が消えたように見えてしまいます。

そこで、引き落としと入金を別々の処理として放置せず、両方そろって初めて成功とみなします。途中でどちらかが失敗した場合は、処理全体をなかったことに戻します。この「全部成功するか、全部取り消すか」という発想が、トランザクションの中心です。試験では、単に言葉の意味を聞くだけでなく、具体例からどの特性に関係するかを選ばせる問題が出やすいですね。

トランザクションは「途中まで成功した状態を残さないための処理単位」と押さえると、ACID特性やROLLBACKもつながって見えます。

場面トランザクションで守りたいこと
銀行振込引き落としと入金をセットで成功させる
在庫更新注文確定と在庫減少を矛盾なく反映する
座席予約同じ席を複数人に販売しない

データベース全体の基礎を先に整理したい場合は、基本情報技術者試験のSQL・データベース問題を解説した記事も合わせて読むと、正規化やSQLとのつながりまで見やすくなります。

COMMITとROLLBACK

トランザクションを理解するときに、必ず出てくる命令がCOMMITとROLLBACKです。COMMITは、ここまでの更新を正式に確定する命令です。反対にROLLBACKは、トランザクション開始後の更新を取り消して、処理前の状態へ戻す命令です。基本情報では英単語のまま出ることもあるので、日本語の意味とセットで覚えておくと安心です。

たとえば、商品を注文する処理で、注文テーブルへの登録、在庫数の減算、決済結果の登録があるとします。すべて成功したらCOMMITで確定します。しかし、決済登録だけ失敗したのに在庫だけ減ったままになると、実際には売れていない商品が在庫切れのように扱われるかもしれません。このような矛盾を避けるため、失敗時にはROLLBACKでまとめて取り消します。

COMMITは「確定」、ROLLBACKは「取り消し」です。試験では、障害発生時にどちらを使うか、処理の整合性を保つには何が必要かという形で問われます。

用語意味よくある選択肢
COMMIT更新内容を確定する正常終了時に反映する
ROLLBACK更新内容を取り消す障害時に元へ戻す
トランザクション処理のまとまり一連の処理を単位化する

ここで大切なのは、COMMITやROLLBACKを単独の暗記語として見るのではなく、トランザクションの「成功なら確定、失敗なら戻す」という流れの中で理解することです。この流れがわかると、後で出てくる原子性や一貫性もかなり覚えやすくなります。

ACID特性の覚え方

ACID特性は、トランザクション処理が満たすべき4つの性質です。Atomicity、Consistency、Isolation、Durabilityの頭文字を取った言葉で、日本語では原子性、一貫性、独立性または隔離性、耐久性と訳されます。基本情報では、英語名よりも日本語の説明文から該当する性質を選ぶ問題が多いので、定義を短い言葉で言い換えられるようにしておくのが大切です。

暗記の入口としては、Aは「All or Nothing」、Cは「正しい状態を保つ」、Iは「同時実行でも互いに邪魔しない」、Dは「確定後は消えない」と考えると扱いやすいです。特にAとC、Iと排他制御が混ざりやすいので、選択肢を読むときは「全部成功か全部失敗か」「データのルールを守るか」「同時実行の影響を受けないか」「確定後に保持されるか」に分けて判断します。

特性日本語短い覚え方
Atomicity原子性全部やるか全部戻す
Consistency一貫性正しい状態を守る
Isolation独立性同時実行でも干渉しない
Durability耐久性確定後は失われない

ACIDは丸暗記だけだと忘れやすいので、問題文の言い換えに反応できる形で覚えるのがおすすめです。

基本情報の選択肢では、「障害が発生しても完了した処理結果を保持する」「他のトランザクションから途中状態を見えないようにする」など、特性名を直接出さずに説明文で聞かれることがあります。特性名から説明を思い出す練習だけでなく、説明文から特性名へ戻す練習もしておくと得点につながります。

原子性と一貫性

原子性と一貫性は、ACID特性の中でも混同しやすい組み合わせです。原子性は、トランザクション内の処理がすべて実行されるか、まったく実行されなかった状態に戻るかを保証する性質です。つまり、途中まで成功した中途半端な状態を残さないことに注目します。銀行振込で、出金だけ成功して入金が失敗する状態を許さない、という説明なら原子性です。

一方で一貫性は、トランザクションの前後でデータベースが正しい状態を保つことです。ここでいう正しい状態とは、業務ルールや制約に違反していない状態のことです。たとえば、在庫数がマイナスにならない、主キーが重複しない、合計金額が明細の合計と合う、といったルールを守るイメージです。原子性が「途中で止まらない」なら、一貫性は「結果としてルール違反にしない」と考えると分けやすいですね。

混同しないコツ

全部成功か全部失敗かを問うなら原子性、データの正しさや制約を問うなら一貫性です。

試験問題では、原子性の説明に「すべて」「まったく」「一部だけ残さない」といった表現が出やすいです。一貫性の説明には「矛盾がない」「制約を満たす」「整合性を保つ」といった表現が出やすいです。どちらもデータを守る性質なので近く見えますが、見ているポイントが違います。

独立性と耐久性

独立性は、複数のトランザクションが同時に実行されても、互いの途中経過に悪い影響を与えないようにする性質です。ある利用者が在庫を更新している最中に、別の利用者が同じ在庫を読んだり更新したりすると、タイミングによっては不整合が起きます。独立性は、こうした同時実行の問題を抑え、あたかも一つずつ順番に実行されたかのように扱えることを目指します。

耐久性は、COMMITされた更新結果が、その後の障害でも失われないようにする性質です。たとえば、注文処理を確定した直後にシステム障害が起きても、確定済みの注文データが消えてしまうと困ります。そのため、ログや補助記憶装置などを使って、確定済みの結果を復旧できるようにします。基本情報では、障害回復やログファイルの話と一緒に出てくることもあります。

  • 同時実行でも互いに影響しないなら独立性
  • COMMIT後の結果が障害後も残るなら耐久性
  • ロックや排他制御は独立性を実現するための手段

独立性は排他制御とセットで理解すると覚えやすいです。耐久性は障害回復、ログ、COMMIT後という言葉に反応しましょう。

基本情報のテクノロジ系全体でどこまで優先するか迷う場合は、基本情報のテクノロジ系勉強法と出題範囲の優先順位で、データベース分野の位置づけも確認できます。

基本情報のトランザクションとデッドロック

排他制御とデッドロックの仕組み

排他制御が必要な理由

排他制御とは、複数のトランザクションが同じデータを同時に扱うときに、不整合が起きないようアクセスを制御する仕組みです。データベースは一人だけが使うものではありません。ECサイトなら、多くの利用者が同時に在庫を確認し、注文し、決済します。このとき、同じ商品在庫を複数の処理が同時に更新すると、正しい数より多く売れてしまう可能性があります。

たとえば在庫が1個しかない商品を、AさんとBさんがほぼ同時に購入しようとしたとします。両方の処理が「在庫1個あり」と読んだあと、それぞれ注文を確定してしまうと、在庫1個の商品に対して注文が2件成立するかもしれません。このような同時実行の問題を防ぐために、更新中のデータを他の処理から守る必要があります。

排他制御がないと、更新消失、二重販売、途中状態の読み取りなど、データの信頼性を壊す問題が起きやすくなります。

問題起きること試験での見方
更新消失後の更新が前の更新を上書きする同じデータを同時更新
二重販売在庫以上に注文が成立する読み取りと更新の競合
途中状態の参照未確定の値を読んでしまうCOMMIT前のデータに注意

排他制御は、ACID特性のうち特に独立性と関係が深いです。つまり、同時に動いているトランザクション同士が互いに悪影響を与えないようにするための具体的な仕組みと考えると、用語同士のつながりが見えます。

共有ロックと占有ロック

排他制御でよく出るのが、共有ロックと占有ロックです。共有ロックは、データを読むためのロックです。同じデータを複数のトランザクションが読むだけなら、値は変わらないので同時に許可しやすいです。たとえば、在庫数を確認するだけの処理が複数ある場合、共有ロック同士は共存できると考えます。

占有ロックは、データを更新するためのロックです。あるトランザクションがデータを書き換えている間に、別のトランザクションが同じデータを読んだり更新したりすると、未確定の値を見たり、更新を上書きしたりする危険があります。そのため、占有ロックがかかっているデータには、他の共有ロックや占有ロックを基本的に許可しません。

種類目的他のロックとの関係
共有ロック読み取り共有ロック同士は共存しやすい
占有ロック更新他のロックを待たせる

試験では「読むだけなら共有、書き換えるなら占有」と覚えると、まず大きく外しにくいです。

共有ロックと占有ロックは、細かいDBMSごとの実装まで追いかける必要はありません。基本情報では、どちらが読み取り向けで、どちらが更新向けか、同時実行時に何を防いでいるかを説明できれば十分です。特に「占有」という言葉から、他の処理を待たせてでも更新中の整合性を守るイメージを持つと覚えやすいですね。

更新消失の考え方

更新消失は、同じデータに対する複数の更新が競合し、片方の更新結果が失われる現象です。例として、ある商品の在庫が10個あるとします。トランザクションAが在庫10を読み、1個売れたので9に更新しようとします。同時にトランザクションBも在庫10を読み、2個売れたので8に更新しようとします。最後にBが8を書き込むと、Aの「1個売れた」という更新が反映されないまま消えてしまいます。

本来なら、合計3個売れたので在庫は7になるべきです。しかし、どちらも最初の10をもとに計算してしまうと、最後に書き込んだ値だけが残ります。このような問題は、更新対象のデータを適切にロックし、同時に書き換えられないようにすることで防ぎます。基本情報では、この流れを文章問題で読み取らせる形が出やすいです。

STEP
同じ値を読む

複数の処理が更新前の同じ在庫数を読み取ります。

STEP
別々に計算する

それぞれが古い値をもとに新しい値を作ります。

STEP
後の更新が残る

最後に書いた処理だけが残り、片方の更新が消えます。

更新消失を防ぐには、「読む」「計算する」「書き込む」という一連の流れを、他の更新処理に割り込まれないように扱う必要があります。これは、トランザクションを単位として管理し、必要なデータにロックをかける理由そのものです。

デッドロックの仕組み

デッドロックは、複数のトランザクションが互いに相手の持っているロックの解放を待ち続け、処理が進まなくなる状態です。たとえば、トランザクションAがデータXをロックし、次にデータYを更新したいとします。一方、トランザクションBがデータYをロックし、次にデータXを更新したいとします。この場合、AはBが持つYのロックを待ち、BはAが持つXのロックを待ちます。

どちらも相手がロックを解放しない限り進めません。しかし、どちらも処理を進められないのでロックを解放できません。このような循環待ちがデッドロックです。基本情報では、単に「ロックを使うと安全」と覚えるだけでは足りず、ロックの取り方によっては処理停止の原因になることまで問われます。

デッドロックは、排他制御を行うからこそ発生し得る問題です。安全のためのロックが、取り方によっては待ち合わせの原因になります。

基本情報のトランザクション問題を確認する学習イメージ

対策としては、ロックを取得する順番を統一する、一定時間待っても進まない処理を取り消す、デッドロックを検出して片方をROLLBACKする、といった考え方があります。基本情報では詳細な実装よりも、「互いにロックを待つ」「循環待ち」「処理が進まない」というキーワードを拾えるようにしておくと判断しやすいです。

トランザクション処理まとめ

基本情報のトランザクション処理は、用語が多く見えますが、中心にある考え方はシンプルです。複数の処理をひとまとまりにして、成功ならCOMMIT、失敗ならROLLBACKします。その処理が正しく動くためにACID特性があり、同時実行で壊れないように排他制御を使います。そして、排他制御の副作用としてデッドロックが起きる可能性があります。

問題演習では、まず文章が何を守りたいのかを見ます。途中までの成功を残さない話なら原子性、正しい状態や制約の話なら一貫性、同時実行の干渉を防ぐ話なら独立性、確定後の結果を保持する話なら耐久性です。ロックが出てきたら、読み取りなのか更新なのか、互いに待っていないかを確認します。

  • COMMITは正常終了時の確定
  • ROLLBACKは障害時や失敗時の取り消し
  • ACIDはトランザクションの信頼性を表す4特性
  • 排他制御は同時実行の不整合を防ぐ
  • デッドロックは互いにロック解放を待つ状態

試験範囲全体の中でデータベース以外も整理したい場合は、基本情報技術者試験の出題範囲と科目A・科目Bの対策法も確認しておくと、学習順序を決めやすくなります。

今すぐ問題で確認したいなら

トランザクションや排他制御は、説明を読んだあとに選択肢で見分ける練習をすると定着しやすいです。

無料で過去問演習する →
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次