データベース中級者必見!その1〜トランザクションとDCL〜
2015/09/14
はじめに
今回は、前回までデータベース初級者用の記事を紹介いたしましたが、今回から中級者編にはいっていきます。
まずこれまでの初級編の記事の一覧です。
・入門編その1〜リレーショナルデータベースについて〜
・入門編その2〜データ検索のためのSQL文〜
・入門編その3〜算術演算と関数を用いたSQL〜
・入門編その4〜条件に一致するデータの検索方法〜
・入門編その5〜複数の条件を指定して検索する〜
・入門編その6〜複数のテーブルから取得する〜
・入門編その7〜複数のテーブルを外部結合する〜
・入門編その8〜3つ以上のテーブルを結合する&選択と結合を同時に行う〜
・入門編その9〜行のグループ化、集計関数、結果をソート〜
・入門編その10〜副問い合わせ〜
・入門編その11〜INSERT文によるデータの追加〜
・入門編その12〜UPDATE文によるデータの更新〜
・入門編その13〜DELETE文によるデータの削除〜
これまでは、データベースのデータを操作する事を紹介してきましたが、今回からはデータを制御する方法についてご紹介していきます。
トランザクションとDCL
トランザクションとは
データベースの操作は、ひとつのSQL文を実行したらそれで完了という場合だけではありません。複数のSQL文を駆使していくつかの操作を行い、それらがすべて正常に行われることニよって一連の処理が完了するといった場合が多々あります。しかし、データベースになんからに障害が発生して、複数のSQL文を実行する途中で止まってしまったらデータベースの整合性が保たれなくなってします場合があります。
銀行のオンラインシステムを例にして考えてみましょう。
例
AさんがBさんの口座に1,000円振り込みます。口座にいくらお金が入っているかというデータは、データベースに登録されているものとしましょう。AさんとBさんの口座には現在それざれ10,000円の残高が表示されています。
まずは、Aさんの口座から出金手続きです。UPDATE文で残高から1,000円引くという次の王なSQL文を使用してデータベースの操作をします。
[sql]UPDATE account SET balance-1000 WHERE name =’Aさん'[/sql]
続いてBさんの口座残高に1,000円プラスするデータベースの操作です。ここもUPDATE文を使用します。しかし、ここで急な障害(停電など)が発生してデータベースとの接続が切れてしまったとしましょう。なんと、Aさんの口座から出金した1,000円は宙ぶらりんの状態になります。
このような事態は考えるだけで恐ろしいものです。
ここでトランザクションの考え方が生きてきます。
トランザクションとは、関連する一連の処理をひとまとまりにとして考えるものです。先程は入出金の例では、「Aさんの口座から出金する処理」をひとまとまりの処理として考えます。そして、データに不整合がおきてしまった場合には、トランザクションというまとまりごとなかったことにするということができます。逆に正常に行えたのならば、処理は確定するといった作業を行うことができます。
トランザクションをなかったことにするSQLはROLLBACKです。
逆に、トランザクションを確定するSQLはCOMMITです。
DCLとは
トランザクションを制御するSQLはDCL(Date Control Language)と呼ばれます。
実際のSQLでトランザクションを制御するイメージをみてみましょう。
この流れではDML①〜③が実行され、その後COMMITが行われているので、各DMLによってデータベースに加えられた変更は確定されます。
次の場合も見てみましょう。
今回は3つのDMLが実行された後にROLLBACKが行われています。この場合は、トランザクションの開始から行われたデータベースへの変更がすべて取り消されます。SELECTはデータベースの変更を加えるものではないので、INSERT,DELETE,UPDATEなどがなかったことになるわけです。
ROLLBACK処理は、基本的にトランザクション単位で行われますが、SAVEPOINTというSQLを使用することによって、トランザクション内の任意の位置にはセーブポイントを作成し、その位置までROLLBACKするといったことも可能です。
DML①を実行した後に「A」という名前のセーブポイントを作成し、DML③を実行した後にセーブポイントAまでROLLBACKする処理をイメージで表しました。
この場合、DML③で加えられたデータベースへの処理が取り消されます。
※ここでのイメージに記述した「SAVEPOINT A」や「ROLLBACK TO A」はMYSQLの場合のSQL文です。
他のRDBMSで異なる記述であったり、そもそもセーブポイントを作成する昨日がないRDBMSも存在します。
最後に
今回は図を交えながら、トランザクションやDCLについてご紹介しました。
次回はデータ定義言語についてご紹介していきます。