トランザクション処理がデータの整合性を保証してくれる
データ処理工程で何らかの障害が発生してしまうとデータに大きな矛盾を発生させてしまいます。データの整合性が信頼できなければ、システムとしては何の意味も持ちません。そのためシステム開発ではプログラム処理以上に正確なデータが担保されているかが大変重要になります。
もちろん正確なSQL文を作れば求めるデータ処理は実行されるでしょうが、SQL文が完璧だとしてもデータベースシステム上でトラブルが発生すればデータ処理は失敗し、データに多大な影響を与えます。
- お金を取り扱う業務で数値に矛盾が生じるのはシステムとして致命的である
- トランザクションは明示的、または沈黙的に実行される
- トランザクションは原子性、一貫性、独立性、永続性のACID特性を満たしている
- ブロックチェーンが注目され始めたことでトランザクション処理の高速化が求められている
銀行などの金融システムで数値処理の失敗は致命的
銀行などのお金を扱う業務システムでトラブルが発生し、処理が途中で自動終了してしまうと、それは致命的なトラブルとなります。
例えば、Aさんがご自身名義のX銀行a口座からAさんのお子様名義のX銀行b口座に10万円を振り込んだとします。外部から見るとa口座の10万円をb口座に移す処理ですが、内部では2つの処理が順番に実行されます。まずa口座から10万円を引く。次にb口座に10万円を足すという2つの処理です。
ですが、この処理の時にa口座の処理が終了し、b口座の処理を開始する前にデータベースシステムにトラブルが発生し、システム処理が自動終了したらどうなるのでしょうか。a口座の10万円がひかれて、b口座の残金は変わらずそのままです。
本来、この2つの処理は一体で処理されるべきなのに、1つだけで終了しているためデータに矛盾が発生しています。100%完璧なデータベースシステムはあり得ませんので、このような事象が発生してしまうのですが、一方で許されない事象でもあります。
これにより10万円は宙に浮いたままとなります。システムの誤操作という話で終わらず、銀行の信用問題にも影響を与えます。
トランザクションの4つの条件
このようなトラブルは予測ができません。そのためデータベースシステムにはトラブルを事前回避する仕組みが組み込まれています。それがトランザクションです。トランザクションとは、データベースを利用するシステムにおいて処理の一貫性を持たせるために一連の(複数の)処理を一つの処理として実行・管理する仕組みを言います。
トランザクション制御はSQL文で実行
では具体的にどのようなSQLを記述すれば、トランザクション処理ができるのでしょうか。トランザクションのSQLは大きく4つありますが、その中でもCOMMITとROLLBACKが良く使われます。
●COMMIT
データ追加・更新・削除などの一連の処理を確定し、トランザクションを終了する制御文です。
(例)
INSERT INTO INCOME VALUES (‘給料’,1000000,’9月25日’);
INSERT INTO INCOME VALUES (‘支払い’,2000,’9月30日’);
COMMIT;
処理の最後にCOMMITを記述することで2つのINSERT文の処理が確定します。
●ROLLBACK
データ追加・更新・削除などの一連の処理をすべて取り消し、トランザクションを終了する制御文です。
(例)
INSERT INTO INCOME VALUES (‘給料’,1000000,’9月25日’);
INSERT INTO INCOME VALUES (‘支払い’,2000,’9月30日’);
ROLLBACK;
2つのINSERT文を流した後でもROLLBACKを実行することで2つのINSERT文の処理を取り消すことができます。ただし、ROLLBACKを実行する前にCOMMITを実行していたら処理は取り消せません。
●SAVEPOINT
SAVEPOINTを作成します。一連の処理の中で処理を区切ります。つぎのROLLBACK TOを使うときに取り消す箇所を指定するのがSAVEPOINTです。
●ROLLBACK TO
SAVEPOINTまでの処理を取り消します。
INSERT INTO INCOME VALUES (‘給料’,1000000,’9月25日’);
INSERT INTO INCOME VALUES (‘支払い’,2000,’9月30日’);
SAVEPOINT ABC;
INSERT INTO INCOME VALUES (‘支払い’,5000,’9月21日’);
ROLLBACK TO ABC;
この場合はSAVEPOINT ABCまでROLLBACKされるので、3つ目のINSERT文だけ取り消されます。
暗黙的なトランザクション制御もある
トランザクション処理には上述したようにトランザクション制御文を明示的に書いてトランザクション処理を実行する場合と記述はしないが、トランザクション処理が実行される場合があります。暗黙的なトランザクション制御です。暗黙的なトランザクション制御には自動コミット(COMMIT)と自動ロールバック(ROLLBCK)があります。
●自動コミット
ORACLEの場合、CREATE文やDROP文などのDDL、もしくはGRANT文やREVOKE文などのDCLを流す、またはSQL DeveloperやSQL*Plusを正常終了した場合は自動コミットがかかります。そのため明示的にコミットしたつもりはないけれど、結果的にコミットしている場合があります。
●自動ロールバック
Oracleの場合、SQL DeveloperやSQL*Plusの異常終了、もしくはシステム障害が発生した時は自動ロールバックがかかります。
トランザクション処理の4条件
トランザクション処理に該当する条件は以下の4点に集約されます。トランザクション処理はこれら4点を満たしていて、それぞれの頭文字からACID特性と言われています。
原子性(Atomicity)
トランザクション処理がすべて実行されるか、もしくはすべて実行されないかを保証する性質です。処理は完璧に遂行されるか、全く遂行されないかの2つに1つです。
一貫性(Consistency)
処理があらかじめ決められた条件の下で実行されていることを保証する性質です。データベース構築段階で設計者が作ったルールに違反する書き込み等は処理されず、トランザクションは終了します。
独立性(Isolation)
トランザクション処理が外部からは隠蔽されて、他の処理に影響を与えないことを保証する性質です。外部からは結果だけが見られます。
永続性(Durability)
トランザクション処理が一度実行されれば、その結果は永続に失われないことを保証する性質です。トランザクション処理の実行過程はログで記録されているので、万が一何らかのシステム障害が発生した場合でもそのログ情報をもとにシステム障害発生前の状況に戻せるため一度実行されたトランザクション処理は永続です。
ブロックチェーンとトランザクション処理
昨今ブロックチェーンが話題になったことでトランザクションに関する議論も深まっています。ブロックチェーンとは中央集権的な管理者を持たずに信憑性のある取引を実現可能にする技術です。トランザクションは第三者(さきほどの入金の例でいえば、銀行)がトランザクション処理を監督する役目を担っていましたが、ビットコインなど新しい金融の登場でブロックチェーンが注目されています。ブロックチェーンは当事者間で取引の正当性を確認しながら、連携して処理が進むため従来の中央集権的な管理者を持つ処理よりも同時並行的な処理が発生するためそれに耐えうる高いトランザクション処理技術が必要になります。ブロックチェーンの高まりによってトランザクション処理の高速化が今求められています。
トランザクションのまとめ
いくらすばらしい業務システムを構築してもデータ処理(データベースに書き込む値)の整合性が疑われるなら、そのシステムは全く使い物になりません。アナログ的手法で数値計算した方がまだ業務として活用できます。
それらの整合性を担保する仕組みがトランザクションです。トランザクションは万が一、データベースに障害が発生した場合、データに不具合をおこさない処理です。
このトランザクション処理が保証されているからこそ、お客様は安心して利用ができます。何も障害が起こらずに処理を確定するのがベストではありますが、突然のアクシデントが発生したとしても安心です。トランザクションがデータをしっかりと守ってくれます。
参考:
http://www.weblio.jp/content/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%87%A6%E7%90%86