トランザクションとは

とらんざくしょん

データベースに対する一連の処理を、まとめて1つの単位として扱うもの。COMMITで処理の結果を確定し、ROLLBACKで開始前の状態に戻す。原子性・一貫性・独立性・耐久性(ACID特性)を満たすように、DBMSがロックやログを使って管理する。

「トランザクション」は、1分野の13問の練習問題に出てきます(データベースの基礎など)。

この用語の分野: データベースの基礎

COMMITとROLLBACK

銀行の振替では、口座Aから引き落とす処理と口座Bに入金する処理の両方がそろって初めて正しい結果になります。トランザクションは、このような一連の処理を1つの単位にまとめ、最後にCOMMITを実行すると結果が確定し、途中でエラーが起きたときなどにROLLBACKを実行すると、トランザクションの中のすべての更新が取り消されます。COMMITしていない更新は、障害が起きた場合にも取り消され、一部だけが反映された中途半端な状態は残りません。

同時実行の制御

多くの利用者が同時にデータベースを使うと、複数のトランザクションが同じデータを読み書きします。何も制御しないと、一方の更新がもう一方の更新で上書きされて失われる(更新の消失)、コミットされていないデータを読む(ダーティリード)などの問題が起きます。DBMSは、共有ロックと専有ロックを使う排他制御や、更新前の版を残して読み出しに使う多版同時実行制御(MVCC)などで、トランザクションどうしの干渉を防ぎます。どこまで防ぐかは、分離レベルで選びます。

障害からの回復

DBMSは、更新の前後の値をログに記録し、ログをデータベース本体より先に記憶装置に書き込みます。障害が起きたあとは、ログをもとに、コミット済みのトランザクションの更新をやり直し(ロールフォワード)、コミットしていないトランザクションの更新を取り消して(ロールバック)、正しい状態に戻します。定期的にチェックポイントを取っておくと、回復のときにたどるログの範囲を短くできます。

トランザクションの練習問題に挑戦

口座表で、トランザクションを開始し、口座Aの残高から300を引く UPDATE と、口座Bの残高に300を足す UPDATE を実行した。その後、COMMITの代わりに ROLLBACK を実行した。口座表はどうなるか。

  1. A口座Bへの加算だけが取り消され、口座Aの減算は残る
  2. B2つのUPDATEがどちらも取り消され、トランザクションを開始する前の状態に戻る
  3. CUPDATEはすでに実行されているので、どちらも取り消されない
答えと解説を見る

正解:B. 2つのUPDATEがどちらも取り消され、トランザクションを開始する前の状態に戻る

トランザクションは、データベースに対する一連の処理を、まとめて1つの単位として扱う仕組みです。トランザクションの中で行った更新は、COMMITを実行すると確定し、ROLLBACKを実行するとすべて取り消されて、トランザクションを開始する前の状態に戻ります。この例では、口座Aの減算と口座Bの加算がどちらも取り消され、2つの口座の残高は元のままです。振替の途中でエラーが起きたときにROLLBACKすれば、一方の口座だけが更新された中途半端な状態が残りません。一部だけを取り消したい場合は、SAVEPOINTで途中に目印を付けておき、ROLLBACK TO SAVEPOINT でそこまで戻す方法もあります。

トランザクションが持つべきACID特性のうち、「口座Aから引き落として口座Bに入金する振替の処理が、途中で障害が起きても、両方とも行われるか、まったく行われないかのどちらかになる」という性質はどれか。

  1. A一貫性(Consistency)
  2. B耐久性(Durability)
  3. C原子性(Atomicity)
答えと解説を見る

正解:C. 原子性(Atomicity)

ACID特性は、トランザクションが満たすべき4つの性質の頭文字をとったものです。原子性(Atomicity)は、トランザクションの中の処理がすべて実行されるか、まったく実行されないかのどちらかになる性質で、障害が起きたときは途中までの更新を取り消します。一貫性(Consistency)は、トランザクションの前後で、データが整合性の制約(残高が負にならない、外部キーの参照先があるなど)を満たし続ける性質です。独立性(Isolation、隔離性)は、同時に実行される複数のトランザクションが互いに干渉せず、1つずつ順に実行した場合と同じ結果になる性質です。耐久性(Durability、永続性)は、コミットしたトランザクションの結果が、その後に障害が起きても失われない性質です。設問の「全部か無か」の性質は原子性です。

よくある質問

トランザクションの途中でエラーが起きたらどうなりますか?

アプリケーションがROLLBACKを実行するか、DBMSが障害からの回復の処理を行うことで、そのトランザクションの中の更新はすべて取り消されます。一部の更新だけが残ることはありません。

トランザクションを長くするとどんな問題がありますか?

長い時間ロックを持ち続けるので、ほかのトランザクションが待たされて同時に処理できる量が減り、デッドロックも起きやすくなります。トランザクションは、整合性を保つのに必要な範囲で短くするのが基本です。

解説の中の「トランザクション」

「トランザクション」が出てくる問題(13問)

  1. 口座表で、トランザクションを開始し、口座Aの残高から300を引く UPDATE と、口座Bの残高に300を足す UPDATE を実行した。その後、COMMITの代わりに ROLLBACK を実行した。口座表はどうなるか。
  2. トランザクションが持つべきACID特性のうち、「口座Aから引き落として口座Bに入金する振替の処理が、途中で障害が起きても、両方とも行われるか、まったく行われないかのどちらかになる」という性質はどれか。
  3. 在庫表のある商品の在庫数は10である。トランザクションT1は在庫数を読み出して3を引いた値を書き込み、T2は在庫数を読み出して5を引いた値を書き込む。ロックをかけずに、T1の読み出し、T2の読み出し、T1の書き込み、T2の書き込みの順に実行されたとき、最終的な在庫数はいくつになるか。
  4. トランザクションを同時に実行したときに起きる問題のうち、ダーティリードの説明として正しいものはどれか。
  5. トランザクションT1が SELECT COUNT(*) FROM 注文 WHERE 金額 >= 1000 を実行したところ8件だった。その直後に、T2が金額2000の注文の行をINSERTしてコミットした。T1が同じSELECT文をもう一度実行すると9件になった。この現象はどれか。
  6. トランザクションT1が、ある行に共有ロックをかけて読み出している。この行に対して、T2が共有ロックを、T3が専有ロック(排他ロック)を要求した。T1がロックを解除するまでの間について、正しいものはどれか。
  7. トランザクションの排他制御で使われる2相ロック方式の説明として、正しいものはどれか。
  8. トランザクションT1は行Aに専有ロックをかけたあと行Bのロックを要求し、T2は行Bに専有ロックをかけたあと行Aのロックを要求したため、どちらも先へ進めなくなった。DBMSがこの状態を検出したときに行う一般的な対処はどれか。
  9. トランザクションT1〜T5があり、障害が発生する前にチェックポイントを1回取った。T1はチェックポイントの前に開始してコミットした。T2とT3はチェックポイントの前に開始し、T2はチェックポイントのあと障害の前にコミットし、T3は障害の時点でコミットしていなかった。T4とT5はチェックポイントのあとに開始し、T4は障害の前にコミットし、T5はコミットしていなかった。障害のあとの回復で、ログを使ってロールフォワードする必要があるトランザクションはどれか。
  10. SQLの文は、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)に分けられる。DDLに分類されるものはどれか。
  11. SQLで DELETE FROM 社員 を、WHERE句を付けずに実行したときの結果として正しいものはどれか。
  12. SQLの標準規格が定める分離レベルのうち、READ COMMITTED で起こりうる現象の組み合わせとして正しいものはどれか。
  13. 多くのDBMSは、データを更新するとき、更新の内容をログ(ジャーナル)に記録し、そのログをデータベース本体より先に不揮発性の記憶装置に書き込む(WAL: ログ先行書き込み)。この方式をとる主な理由はどれか。

データベースの基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

SQL 分離レベル ACID特性 デッドロック 外部キー 2相ロック ビュー インデックス E-R図 関係データベース

用語集の一覧へ