Help us understand the problem. What is going on with this article?

データベースまとめ①(CRUD SQL トランザクション)

データベースに関して理解を深めるためにまとめました。

今回は用語のまとめです。SQL編、設計編、後は私が普段RubyやRailsを使っていますので、アクティブレコードが普段何をやっているのか見てみる編などもまとめていこうかと思います。

私自身、現在もまだその全貌を掴みきれていないのですが、できる限り文献等にあたりながら、記述することを心がけます。(訂正箇所などお伝えいただけると非常に助かります!)用語の説明は「である」調、心の声や脱線は「ですます」調です。

存在意義

データベースは、情報を保存しておく装置にとどまらず、
効率よく利用できるための構成をも持つことが期待される。

行とか列とかカラムとか

緯度や経度がどっちだったけ問題のように私がよく迷いますので、ここでまとめておきます。

IMG_0210.jpg

縦 カラム

横 ロウ

レコード

データそのもの、行の意味で使われることも

フィールド

マス一つ

ライフサイクル(CRUD)

create

データベースを設計し作成する。

read

利用者はそこから情報を読み出す。

update

データベースに保存された情報の更新。

delete

不要になった情報を削除する。

SQL(Structured Query Language)

データベースを操作するための言語。さらに細かく分類できる。

DDL (Data Definition Language/データ定義言語)

データベースそのものや、テーブルを作成したりする。
CREATE:作成
DROP:削除
ALTER:変更

DML (Data Manipulation Language/データ操作言語)

SELECT:選択
INSERT:行を新規登録して差し込む
UPDATE:更新
DELETE:削除

DCL (Data Control Language/データ制御言語)

COMMIT:変更の確定
ROLLBACK:変更の取り消し
GRANT:操作権限を付与
REVOKE:操作権限を剥奪

トランザクション

データベースを更新するような単一の処理、いくつかまとまった一連の処理。
全ての処理を終え更新内容を確定させるのか、処理をする前の状態に戻すのかの2択となる。

つまり、一つにまとめて実行させるべき更新処理のまとまり、捉え方を変えれば、複数の処理を一つにまとめることで意味付けを与えることでもある。

コミット

トランザクション処理を完了し、更新を反映させる。

ロールバック

トランザクション処理が開始される以前の状態に戻す。

例1
ユーザの情報登録で、氏名、メールアドレス、住所、電話番号の4つを登録することが必要であるとする。この処理を一つのセット=トランザクションとして捉える。仮にメールアドレスに一意性制約がかかっていたとして、登録ができなかった場合、残りの3つも登録前の段階にロールバックする。中途半端な状態(この例の場合メールアドレスだけ空になる)を許さないということである。

例2
商品が売れた数だけ販売数を増加させ、その分だけ在庫を減らすというような場合、これも一連の処理として一つにまとめられるべき性質のものである。一方だけ行われることを許せば忽ち現実とデータベースの整合性が取れなくなってしまう。

ACID特性

トランザクションに求められる4つの性質。

原子性(Atomicity)

トランザクションの処理の帰結はコミットかロールバックの2つに一つである。(不可分性という訳をされることがあります。こちらの方がわかりやすいと思います。)

一貫性(Consistency)

あらかじめデータベースに設定された制約と矛盾する処理が含まれていてはならない。そのような処理を含むトランザクションはロールバックされる。
(先ほどの例1でロールバックが起きるのは、一意性制約を無視して重複するメールアドレスを登録しようとしたためです。整合性と訳される場合もありますが、こちらの方がわかりやすいと思います。)

独立性(Isolation)

トランザクション同士の干渉がない。実行中の状態が隠蔽される。

独立性の説明

あまりイメージが湧かなかったので説明を書いておきます。
例えば処理が、「Aの得点から500を引いて、その後にBに500を与える」としましょう。
最初の両者の持ち点を1000点とします。

人物 得点
A 1000
B 1000

①Aから500を引いて

人物 得点
A 500
B 1000

②Bに500与える

人物 得点
A 500
B 1500

有り体に言ってしまうと、①のように別に途中の状態を考えなくても、開始前と開始後だけ他から見えるようにしておけば良くないか?ということです。

こうすると処理を直列にしなければならず、処理速度を犠牲にするのでどの程度分離するのかという問題が生じます。

ASID特性について参考にさせていただいた記事
私の記事よりもよほど参考になります。ぜひご覧になってください。

永続性(Durability)

トランザクションが一度終われば、その時点での状態は障害が起きようとも保証される。
(実行記録を取っておいて障害に備えたりして永続性を担保する)

トランザクションの書式

(トランザクションを開始する宣言);
 処理
 処理
  .
  .
  .   
(COMMIT あるいは ROLLBACK);

使用するデータベースで書式が異なる

データベース 開始宣言
SQL PostgreSQL BEGIN TRANSACTION
MySQL START TRANSACTION
Oracle DB2 なし

実際には、トランザクションの開始時点は意識しないでも、1つのSQL文を1つトランザクションの中で処理するという暗黙のルールが適用されている場合もある。(SQL PG MySQL)
Oracleの場合、ユーザがCOMMITかROLLBACKするまでが一つのトランザクション。

つまり前者はSQL文を一つ書くと、自動的に開始宣言とコミットに挟まれるということ。

IMG_0211.jpg
図にCOMMITのI抜けましたごめんなさい。イメージだけ掴んでいただければ。

参考文献

SQLゼロからはじめるデータベース操作 
入門データベース

ありがとうございました!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away