今日は、DBについてどのように一貫性を保証しているのか調べて見ました。
データベースの基本
- データベースの定義は、ある目的の為に体系的に集められたデータの事を言います。
- データのまとまりとしては、ファイルやフォルダも同様ですが、それらとの違いは
- ファイル・フォルダ:個人でのデータ管理を目的としている
- データベース:複数人でのデータ管理を目的としてる
- DBの特徴
- データの共用:複数人で使えるよ
- データの一貫性:複数人で使っても不具合がない仕組みだよ
- データの独立:プログラムと独立しているよ
- DBの特徴
な特徴があります。
- DBを利用したシステム(MySQL・PostgresSQL)の事をDMMS(データベース管理システム)と言います。
DBモデルの種類はありますが、一般的に使われるのがリレーショナルデータベースです。
リレーショナルデータベースの概要
- リレーションは関連づけという意味で、行と列で表された二次元のデータ構造を複数関連づけているイメージです。
- 特徴
- 行を一意に識別するための主キー:PrimalyKeyをもつ
- データ操作はSQLでRDBMSを介して行う
- 特徴
データベースの制御
では、どのように一貫性を保つ仕組みがあるのでしょうか?
トランザクション
トランザクションとは、DB処理に対するいくつかの処理が意味を成す一つのまとまりです。
例でよく出るのが口座振替です。
これは、出金と入金が両方成立しないと、やばいことになります。
両方成立して初めて意味をなします。
ここで、疑問が生じました。データの始まりと終わり(意味を成すまとまり)をどこで定義しているのか?
PostgreSQL では、BEGIN 文または START TRANSACTION 文でトランザクションが開始されます。この後 COMMIT 文を実行するまでは、INSERT/UPDATE/DELETE によるデータ更新は保留され、データベースにはすぐには反映されません。COMMIT 文を実行することで、トランザクションが終了し、データの変更がまとめてデータベースに反映されます。また ROLLBACK 文を実行することでもトランザクションが終了しますが、この場合はトランザクション内でのデータの変更がすべてキャンセルされます。
基本は一つのSQL文に対して、BEGIN あるいは START TRANSACTION を実行しなくても自動的にトランザクションが開始され、COMMIT 実行が行われているようです。
トランザクションのコマンド
BEGIN・START TRANSACTION:トランザクションの開始します。
COMMIT・END:コミットしてトランザクションの終了します。
ROLLBACK・ABORT:トランザクションを途中停止し処理を最初からすべて取り消します。
仕様によってはトランザクションをOFFにするケースもあります。
デフォルトではAuto CommitはONになっていますが、AUTOCOMMIT変数にonまたはoffを指定すれば、自動コミットの有効・無効を設定できます。
ロック(同時実行の制御)
ロックとはその名の通り、同時にデータの変更を行おうとした際に、片方の変更を禁じます。
ロックに関しては、こちらの方の記事が参考になります。
データベースの「ロック」という概念は2種類ある
#####アプリケーション側でのSQLを設定すれば、トランザクションも自由設定できるようですね。
<参考>
PostgreSQL 7.2.3 チュートリアル
https://www.postgresql.jp/document/9.4/html/tutorial-transactions.html