トランザクションについて 初めから丁寧に Vol.01

最近、改めて トランザクションとは? となる事が多いので 初めから丁寧に勉強してみる。

トランザクションとは??

そもそも、トランザクションとはどういう物だろう? という事を考えてみた時に自分の言葉で説明出来る自信が無いな、という感だったのでひとまず 文献読むなりして 理解出来そうな言葉に落としこんでみた。

ひとまず、僕の理解としては

複数の処理をまとめた処理単位のことで、かつ下の4つ( ACID 特性 ) の要件を満たすもの というような理解をしました。

Vol.01 としているのでお察しの通り、続きものに書いてみようかと思っているので、まず今回の記事では ACIDとは何か? を理解出来る事を目標としたいと思います。

ACID 特性 とは

トランザクションが満たすべき、4つの要件の各頭文字をまとめたものです。

4つの要件とは

  • 原子性(atomicity)
  • 一貫性(consistency)
  • 独立性(isolation)
  • 永続性(durability)

この4つです。

それぞれ、普段あまり聞き慣れない言葉(もある)なのでちゃんとおさえてみます。

原子性(atomicity)とは

言葉の定義としては以下のようになります。

複数の処理を1つにまとめて実行した場合、それらの処理は すべて実行されるか または まったく実行されないか のどちらかの結果にならないといけない、という性質の事.

例えば、良く例とされるのは 銀行取引 ですね。

例)

トランザクション開始
 処理1: ikkitang の口座i から 1万円を引く。
 処理2: takahashi の口座t へ ( 処理1で引いた) 1万円を送金する。
トランザクション確定

開始から終了までの間の 処理2で失敗したらトランザクション全体を失敗とし、処理1で引いた1万円を戻す必要があります。 矛盾が発生してしまうのを防ぐ為です。

一貫性(consistency)とは

言葉の定義としてはこんな感じ。

トランザクション開始と終了時にあらかじめ与えられた整合性を満たすことを保証する性質の事.

もっというと、データベースのデータに矛盾の無いように整合性を満たさないといけない、みたいな性質のことです。

今回も 銀行取引を例にしてみます。

トランザクション開始
 (整合性条件) 銀行口座の預金は常に 0円以上でなければならない。
 (前提)  ikkitang の口座i には 100円が入っている状態。
 処理1: ikkitang の口座i から 500円を引き落としする。
トランザクション確定

処理1の時点で 口座がマイナスになる為、整合性条件 を満たしません。

よって、このトランザクションは失敗とする必要があります。

独立性(isolation)とは

日本語では 別名として 分離性 などと呼ばれる事もあります。

言葉の意味としてはこんな感じです。

作業中のトランザクションによる更新は、それが確定するまで 他のトランザクションから隠蔽されていないといけない、という性質の事.

この独立性を完全に保障するには完全に直列化するしかなく これを守る事はしばしば 性能、つまり速度が犠牲になります。

一般的には この性質は 要件に応じて 緩和する事で性能をより引き出せるように調整される事が多いです。 次回移行で触れていこうかな と思っていますが それが トランザクション分離レベル という概念になります。

なんて銀行取引の例は便利なんでしょうw 例によって、銀行取引です。

トランザクション開始
 (前提): ikkitangの口座i には 10万円 入っている。
 (前提): takahashiの口座t には 15万円 入っている。
 処理1: ikkitang の口座i から 1万円を引く。
 処理2: takahashi の口座t へ ( 処理1で引いた) 1万円を送金する。
トランザクション確定

トランザクション内、処理1が完了・処理2が未 のタイミングで 口座iに9万・口座tに15万 の状態になります。

トランザクション内での送金の状況は 外部から参照する事は許されず、この状態の情報を取る事は出来ません。

確定して初めて 口座iに9万・口座tに16万 ある、という事実を知る事が出来ます。

永続性(durability)とは

言葉の定義としてはこんな感じです。

確定したトランザクションの結果は永続的に失われない性質の事.

トランザクションを実装するには、これを満たさないといけないです。 例えば、データベース では トランザクション操作 を ログ という形式で記録し、障害発生時にはそこから復旧を試みる事が出来る事によって実現されたりしています。

まとめ

トランザクションを実装するには ACID 特性とよばれる 4つの要件をクリアする必要がある。

実は これらを厳密に実装するには 性能面を犠牲にしないと 出来なかったりする。

そこで出てくるのが トランザクション分離レベル などの話。 明日とか以降で時間見つけてまとまたいな。

告知

dbstudychugoku.connpass.com

隔月で DBの勉強会をやっています。

次回の勉強会は Explain の話などからはじまって SQLチューニングの話をしていこうかと思います。

是非、ご都合があえばよろしくお願いいたします〜。