日本オラクル株式会社
井上 学 (いのうえ まなぶ) 山田 真二郎(やまだ しんじろう)
「基礎からはじめるデータベースセミナー」は、データベースの知識を習得するにはまず何から始めたらよいのかと、書籍やセミナー情報を探している方のためのセミナーです。これまでデータベースに触れたことのない方や、おもにメインフレームやオフコンを中心に扱ってきたために、オープンな環境で動くリレーショナル・データベースに携わった経験がない人たちや営業職の方向けに、「そもそもデータベースって何だろう?」というところから始まり、リレーショナルデータベースのしくみとOracle Databaseのアーキテクチャを基本から学習することを目的としています。第6回目の今回は、トランザクション、ロック、セキュリティの機能についてご説明します。
前回の講義では、SQLについてご説明しました。データベースに対しデータを容易に参照/更新できるということをご理解いただけたかと思います。しかし、データベースをビジネスの場で使おうとすると、参照/更新ができるというだけでは不十分です。データベースにはビジネス用途のためのいくつかの機能があります。今回はとくに、トランザクション、ロック、セキュリティの機能についてご説明します。
トランザクションとは、ある仕事を完結させるための最小単位のことです。多くの場合、仕事は複数の関連した作業によって構成され、それらが完了することで作業が完結します。
たとえば、ある会社の支社から倉庫に対して「コピー機を2台大阪支社に送ってください」という要求を出したとします。すると倉庫側では、
(1)コピー機を2台出庫する (2)コピー機を2台大阪支社に搬送する
という2つの作業が完了してはじめて「コピー機を2台送ってください」というリクエストに応えることができます。
“「コピー機を2台大阪支社に送ってください」というリクエストに応じることができた”というのがつまり、“コピー機を2台大阪支社に送るというトランザクションが完了した”ということですね。
図1:トランザクション
はい。では次に、データベースではこのような複数の工程がどのように処理されるのかを考えてみます。「銀行で振込みをする」ことを例に考えましょう。
「AさんからBさんに5万円振り込む」ことを実行したいとします。この場合、銀行のシステムでは、以下のような一連の作業が必要です。
(1)Aさんの口座から5万円を差し引く (2)Bさんの口座に5万円を加算する
この2つの作業が完結して初めて「振込み」という1つのトランザクションが完了します。もし仮に(1)の作業完了後に何かシステムに不具合が発生し、Aさんの口座からは5万円引かれたのにBさんの口座にはまだ5万円加算されていないという状態が発生したらどうなるでしょう?
それでは、当然混乱がおきてしまいます。
ですよね。だからデータベースでは「一連のトランザクションが完了した」ことを認識するために、「COMMIT(コミット)」というコマンドを実行します。これによりデータベースへの変更が確定されます。
また、「Aさんが途中で処理を取り消してしまった」というように、処理が途中でキャンセルされてしまった場合には、トランザクション内の変更が取り消されなければなりません。これを、データベースでは「ROLLBACK(ロールバック)」といい、データはトランザクションが開始される前の状態に戻ります。もし、システムダウンといったような何らかの不具合が発生したとしても、このロールバック機能によってデータの正しい状態は保護されます。
※ここで紹介したCOMMITやROLLBACKというコマンドも前回紹介したSQLの仲間で、DCL(データ制御言語)とよばれています。
図2:トランザクション管理
データベースの重要な要件の1つに、データを共有できることがあげられます。しかし、複数のユーザーがデータの共有ができるということは、同じデータが同時に更新されることもありえます。その際にデータの不整合が発生しないように、作業中のデータを上書きさせないような仕組みが必要です。データベースではそのような仕組みをロック(排他制御)と呼びます。
これも例をあげて説明しましょう。仮にいまBさんの口座に10万円あったとします。AさんからBさんに5万円の振込み、Bさんが自分の口座から3万円を引き落とす、という2つの処理が同時に発生した場合を考えます。排他制御なく処理をしてしまうと、Aさんの振込み処理からは「10万+5万=15万円」、Bさんの引き落とし処理からは「10万-3万=7万円」という結果が返り、Bさんの口座残高を更新する際に後に書き込まれたデータ(7万円)が先に書き込まれたデータ(15万円)を上書きしてしまいます。もちろんこの場合は5万でも10万でもなく、12万円が正しい結果となります。こういったことを避けるためにロック機能を使い、同じデータに対して一度に複数の更新が発生しないようにする必要があります。
これも例をあげて考えてみましょう。まずはAさんから更新処理のリクエストがあると、データベースはロックの権利をAさんに渡します。ちょうど1つしかない鍵をイメージしてください。データにはAさんしかアクセスしかできず、この間、Bさんから上書きされることはありません。Aさんの処理が完了するとロックが解除され、他のユーザーからのアクセスが許可されます。そしてBさんからの更新リクエストがあると、Aさんの時と同様にロックの権利がBさんに渡され、処理が終わりロックが開放されるまで他のユーザーがアクセスすることはできません。
図3:データの同時更新
図4:排他制御
データベースは、このようにして複数のユーザーから不正にデータが上書きされることがないようにコントロールしているのですね。
セキュリティも、データベースをビジネスで使用する際の重要機能です。データベースを使うと情報共有がしやすくなる反面、機密情報まで取り出されたり、改ざんされてしまうといったリスクがあることを認識しておかなければなりません。とくに昨今では、個人情報の漏洩などの問題がニュースになりマスコミを騒がせていますから、皆さんも興味のあるところでしょう。
データベースには、おもに以下のようなセキュリティ保護のための機能があります。
認証とは、「ユーザーが誰か」を特定するためのものです。つまり、「データベースにアクセスしている人は本当に本人か」といったことを識別するための機能を指します。
普段よく使っている「ユーザー名」と「パスワード」も認証機能の1つですよね。
はい。もっとも一般的な認証機能ですね。ほかにも、ICカードによる認証などもあります。
「誰であるか」が認識されると、次にそのユーザーのデータに対するアクセス権限の設定が必要となります。たとえば、すべてのユーザーがデータベースのすべてのテーブル内のデータを参照できるとしたら、機密情報もリスクにさらされてしまいます。ですから、データベースでは「必要な人のみが必要なデータにアクセスできる」ようにコントロールされている必要があります。
しかし最近のデータ漏洩の事件では、不幸なことに正しい認証情報と正しいアクセス権限をもった人がデータを持ち出してしまう、いわゆる「内部犯行」的なものがよく目に付きます。そのため、誰が、いつ、どのデータに、どういうアクセス(処理)をしたのか、といったような記録を残す監査機能が備わったデータベースもあります。権限の有無にかかわらず、監査機能があれば監査証跡(足あと)が残されますので、不正なデータアクセスがあったかどうかの追跡が可能となります。また、多くの場合データベースはネットワーク上にありますので、盗聴される恐れがあります。データベースではデータを暗号化することによって盗聴などの行為から守ることが可能です。
残念ながら、情報漏洩などのセキュリティ関連の問題は後を絶ちません。やはり各組織できちんとセキュリティポリシーを策定し、遵守することが大切だと思います。
図5:セキュリティ
これらの他にも、バックアップのための機能やパフォーマンス、可用性向上のための機能といったものがデータベースには実装されています。
"基礎から始めるデータベース入門セミナー" インデックスに戻る
本記事は、「オラクル通信」の同名連載記事から抜粋し、一部に修正を加えたものです。
Copyright © 2010, Oracle Corporation Japan. All rights reserved.
無断転載を禁ず
この文書はあくまでも参考資料であり、掲載されている情報は予告なしに変更されることがあります。日本オラクル社は本書の内容に関していかなる保証もいたしません。また、本書の内容に関連したいかなる損害についても責任を負いかねます。
Oracleは米国Oracle Corporationの登録商標です。文中に参照されている各製品名及びサービス名は米国Oracle Corporationの商標または登録商標です。その他の製品名及びサービス名はそれぞれの所有者の商標または登録商標の可能性があります。