👀

トランザクションの行方

2022/09/16に公開約2,200字

私は現在IPAの国家試験 データベーススペシャリストの勉強中です。
勉強しているうちにトランザクションを語りたくなったので書いてみました。

RDBMS(リレーショナルデータベースマネジメントシステム)

データを保存するための入れ物であるデータベース。
その種類のなかにRDBMS(リレーショナルデータベースマネジメントシステム)というものがあります。
MySQL,PostgreSQL,Oracleなんかが有名です。

RDBMSの基本構造

一般的なRDBMSでデータを取得する手順は以下の通りです。

  1. クライアントプログラムがどんなデータ取得したいのかをRDBMSに伝えます
  2. RDBMSはストレージ(ファイル)から目的のデータを探し出します
  3. RDBMSはクライアントプログラムにデータを返します

上記の手順1でどんなデータが取得したいのか(もっというとRDBMSに何をして欲しいのか)を伝えるための言語がSQLです。

トランザクション

トランザクションの役目

RDBMSは中途半端にデータが更新されることが絶対に怒らないように実装されています。

例えば、以下のような銀行のシステムの送金処理を考えてみます。

なんちゃってSQLで書くと
Aの残高を減らす
Bの残高を増やす

このような処理において 「Aの残高を減ら」 した後、Bの残高を増やす 前に 何らかのエラーでBの残高を増やせなかったとしたらどうなるでしょう?

Aの口座からは残高が減りましたがBの口座に送れていません
エラーが起きたからといってこんなことが起きてしまったら口座の金額が合わなくなってしまいます。

これを解決するためには

もし処理の途中でエラーが発生してしまったら「Aの残高を減らす」処理もなかったことにして欲しい (=エラーが発生したらAの残高を減らさないでほしい)

これを叶えるRDBMSの機能がトランザクションです。

トランザクションを利用する

トランザクションではSQLの複数行を1つにまとめて扱うようにします。

なんちゃってSQLで書くと
送金処理トランザクション はじめ
  Aの残高を減らす
  Bの残高を増やす
送金処理トランザクション 終わり

RDBMSはSQL文がトランザクションでまとめられている時にトランザクション実行中にエラーが発生したらそのトランザクションごと実行しなかったことにしてくれます

トランザクションの行方

このようにトランザクションで処理をまとめることで途中でエラーが発生しても中途半端なデータを作らないことができるようになります。

よってトランザクションは以下のように動作します。

  1. トランザクション内の処理を実行します
  2. 途中でエラーが発生したら元にもどす
  3. 成功したら更新結果をDBに反映する

ここで

  • 2.で元に戻すことを ロールバック と言います。
  • 3.で更新結果をDBに反映することを コミット と言います。

つまりトランザクションには 成功してコミット するか 失敗してロールバック するかの2つの未来が待っています。

また、SQLで書いてみると次のようになります。

なんちゃってSQLで書くと
送金処理トランザクション はじめ
Aの残高を減らす
Bの残高を増やす
コミット または ロールバック
MySQLで書くと
// 1. トランザクションのはじめ
BEGIN;  

// 2. トランザクションの内容
INSERT INTO ...
DELETE FROM ...

// 3. 成功または失敗
COMMIT; // コミット
ROLLBACK; // ロールバック

Discussion

ログインするとコメントできます