See the Elephant

1992生まれのプログラマが書くエンジニアブログ

本当に恥ずかしくて言えないけど, 入社2ヶ月の新卒が今更データベースについて勉強したので新卒向けに書いてみた

お願い

勉強中なので間違えていることが書いてあるかもしれません.
気づいた方はコメントで指摘していただけると嬉しいです

TL;DR (too long, don’t read)

新卒向け. データベース, 特にトランザクション, ACID特性についてまとめた.

トランザクションはDBに対する一連の処理のまとまり.

ACID特性について適当にまとめると,こんなやーつ.

DBに対する
A: 中途半端な操作は許さないし,   
C: 正しい操作は通すし違法な操作は通さないし,  
I: 並列で行われている操作同士は一切関与しないし,  
D: どんな操作も必ず動作を保証する.   

入社と無知の知

入社して2ヶ月が経った.
ちょっとずつ生活も落ち着いてきたし, DBについて勉強したことをまとめたいと思う.
特にACID特性については, 図を入れて簡単に説明したい(したつもり).

学生時代にサークルでRailsでゆるふわWebサービスを作っていたので, Webプログラマ気取りをしていたら今とても痛い目にあっている. 修士卒とは思えないほど知識なさすぎてまじでやばい.
この記事が言っていることが身にしみる.
今すぐ辞めて欲しい、「Ruby on Rails勉強してます」「CakePHP勉強してます」

ActiveRecord & Rails consoleが強力しすぎてSQLを書いてこなかったので全然SQLがかけない.

痛い目を見ているので, ここ2,3週は自分の弱点であるDB, SQLあたりを勉強していた.

勉強に使っている本はこれ.

マンガでわかるデータベース

SQL 第2版 ゼロからはじめるデータベース操作 ミック

マンガでわかるデータベースはドチャクソわかりやすいので是非読んでみてほしい.
小難しい正規化あたりを妖精が教えてくれますლ(´ڡ`ლ)

ここ2週くらいで ゼロから始めるデータベース 第4章 トランザクションまで勉強した.

概念的なのでおそらく一番覚えにくいであろうACID特性についてまとめる.
トランザクションについて触れる必要があるのでそこも触れる.

基本的なSQLの操作(CRUD)についてはdotinstall MySQLを見て欲しい.
課金すると女性ボイスで聞けるので勉強に気が向かない人は課金オススメ.

ココらへんも分かりやすかった.

[SQL] データベース | TECHSCORE(テックスコア)

postd.cc

トランザクション

トランザクションとは, 1つ以上の更新処理をひとまとまりにまとめたものである.

つまり, insert, update, deleteのうちどれか1つを1回実行してもトランザクション, それぞれを複数回実行してもトランザクションと呼ぶ.

トランザクションとはあくまでも, データベースに対する1つ以上の更新処理の名称 である.

トランザクションの開始と終了

start transaction と commit

トランザクションを作るためには開始文と終了文を書く必要がある.

これは標準規格によって決まっているわけではないためRDBMSによって違う.

僕が使ってるmysqlではこう書く.

start transaction - - トランザクション開始

insertupdate …
処理 ….

commit; // 処理の確定(トランザクション終了)
  

このように, start transactionからcommitまでが一連の処理としてみなされる.

rollback

何らかの原因でトランザクションを途中でやめたい場合は, rollbackを行う.

これは, トランザクションを中断しトランザクション前のDBと同じ状態に戻ることを意味する.

start transaction -- トランザクション開始

insertupdate …
処理 ….

rollback; -- 処理の破棄(トランザクション終了)
  

トランザクションcommitが行われるまでDBに変更を加えないため, rollbackしたとしてもDBには何の影響も与えない.

トランザクションの開始と終了タイミング

これはRDBMSに拠って違うので注意が必要.

oracleに関しては, 自動でstart transactionを行うらしくcommitのみ明示的に書くようだ.

ACID特性

標準規格ではACID特性を守ることが取り決められている.
ACID特性はトランザクションを利用したDBが最低限担保すべき特性である.
つまり, どのRDBMSを使ってもこれだけは守られているルール である.

個人的な意見としてはこういう標準化されたものほど覚えるべきだと思ってるけど, 使わないからすぐ忘れるんだなぁ…

では一個ずつやっていこう.

A: Atomicity 原子性

f:id:namu_r21:20170529205133p:plain:w500

DBに対する操作はcommit(全て実行) か rollback(全て破棄)のどちらかが必ず適用されることを保証すること. つまり, トランザクション途中の中途半端な変更は適用されないことを指す. DBに対する変更はやるかやらないかどちらかだということ.

C : Consistency 一貫性

f:id:namu_r21:20170529205456p:plain:w500

データベースには予め制約を持たせることができる. この制約を違反するトランザクションは絶対にrollbackすることを保証すること. つまり, 制約がDBにデータを追加する際のフィルタ(validator)として動作する.

I : Isolation 独立性

f:id:namu_r21:20170529205143p:plain:w500

並列で処理されているトランザクションは, お互いの処理内容に干渉を受けないことを保証すること. commitされるまで別のトランザクションの内容は反映されず, また, 他のトランザクションからは見えない, 独立していることを保証すること.

D : Durability 永続性

f:id:namu_r21:20170529205147p:plain:w500

終了したトランザクションの動作は喩えDBが障害時であってもデータ変更の動作を担保すること. 最もポピュラーな方法は, トランザクションログをとっておき障害時のDBに対する操作を復元することで実現される.

まとめ

今回はACID特性についてまとめた. ここまで読むと, TL;DRに書いたことが分かっていただけたと思う.

  
トランザクションはDBに対する一連の処理のまとまり.    

ACID特性について適当にまとめると,こんなやーつ.  

DBに対する
A: 中途半端な操作は許さないし,   
C: 正しい操作は通すし違法な操作は通さないし,  
I: 並列で行われている操作同士は一切関与しないし,  
D: どんな操作も必ず動作を保証する.   

実際業務でもガッツリSQL触ることが多くなってきたので, 早く身につけないとなぁ…