以下に添付図面を参照して、この発明の実施の形態にかかる、データベース管理装置を詳細に説明する。
[0.定義]
「ロック二分木」とは、データベース管理システムが、処理のための資源に対するロックの割り当て及び解放の状態を記録するデータである。
「ノード」は、ロック二分木の節点である。各ノードはロウロックオブジェクトとして生成される。
「ロウロックオブジェクト」は、ロックの割り当ての元となる更新要求を行ったユーザを特定する情報であるユーザ特定情報、ロック対象範囲の最小値を特定する範囲最小値情報、ロック対象範囲の最大値を特定する範囲最大値情報、右子ノードを特定する情報である右子ノード特定情報、左子ノードを特定する情報である左子ノード特定情報を有するデータである。ロウロックオブジェクトは、上記ノードをデータとして見た場合の構成要素である。「ノード」は、対応するロウロックオブジェクトのユーザ特定情報、ロック対象範囲の最小値を特定する範囲最小値情報、ロック対象範囲の最大値を特定する範囲最大値情報、右子ノードを特定する情報である右子ノード特定情報、左子ノードを特定する情報である左子ノード特定情報を有する。
「ロック対象行範囲」は、上記範囲最小値情報及び範囲最大値情報によって規定される行範囲である。この行範囲に含まれる全ての行についてロックが割り当てられていることを意味する。本明細書中、行範囲を「A、B」(但しA<B)と表記することがある。これは行番号Aから行番号Bまでの各行を意味する。例えば、行範囲「5、8」は、行番号5、行番号6、行番号7、行番号8の4つの行を意味する。また、行範囲「A、A」と表記される場合は、行番号Aのみが対象であることを意味する。
[1.データベースシステム等の構成例]
図1は、本実施の形態にかかるデータベース管理装置を含むマルチユーザ・データベースシステムの構成例を示すブロック図である。
マルチユーザ・データベースシステム1は、複数のユーザが同時にデータベースにアクセスするシステムであって、例えば受発注システムや座席予約システムなどである。
マルチユーザ・データベースシステム1は、クライアント50と、ネットワーク40を介してクライアント50と接続可能なアプリケーションサーバ60と、アプリケーションサーバ60と接続されたデータベース装置2とを有する。
データベース装置2は、データベース30を記憶するデータベース記憶部20と、データベース管理部10を有する。データベース装置2は、クライアント50からのリクエストなどに対してデータベース30の検索、更新などの処理を行い、処理結果を返す。
データベース管理部10は、コンピュータのデータベースを構築するために必要なデータベース運用、管理のためのシステム、及びそのソフトウェアである。
アプリケーションサーバ60は、クライアント50からのHTTPのレスポンス要求を処理するウェブサーバとバックエンドのデータベース管理部10を中心とするデータベース装置2への橋渡しを担い、データの加工などの処理を行う。
データベース装置2は、例えばコンピュータ、ワークステーションなどの情報処理装置によって実現される装置である。この情報処理装置は、演算処理装置(CPU)、主メモリ(RAM)、読出し専用メモリ(ROM)、入出力装置(I/O)、及び必要な場合にはハードディスク装置等の外部記憶装置を具備している装置である。
クライアント50は、コンピュータネットワークにおいてサーバの提供する機能やデータを利用するコンピュータ、通信端末装置、携帯通信端末装置などである。クライアント50は、タッチパネルやキーボードなどの入力部51と、グラフィカルユーザインターフェイスを提供するGUI部52と、入力に応じてメッセージ、コマンドなどを生成してアプリケーションサーバ60に送信し、アプリケーションサーバ60から受信したメッセージやデータを処理し、GUI部52を介してユーザに情報を提供させる論理プログラム部53を有する。
図2に、本実施の形態にかかるデータベース管理部10の構成例を示す。データベース管理部10は、SQL文解析部11と、データ制御部12と、ロック制御部13と、データロック情報記憶部14とを有する。
なお、これら構成要素はデータベース装置2の機能を、機能ごとにまとめてブロックとして捉えたものであり、データベース装置2が各構成要素に対応する基板、装置、回路、部品などの物理的構成要素を備えていなければならないことを意味するわけではない。また、「接続されている」とは、データ、情報、命令などの送受信、受け取り、受け渡しなどが可能な状態になっていることをいい、互いに配線で連結されているような物理的な接続に限られる意味ではない。
SQL文解析部11は、受け取ったSQL文が更新系の命令か否かを判定する機能を有する。命令が更新系の命令であれば、データ制御部12に更新系の命令を処理させる。
データ制御部12は、SQL文解析部11から更新系の命令を受け取ると、データベース記憶部20に記憶されたデータの該当行がデータロックされているか否かを、データロック情報記憶部14に記憶されたロック二分木15を参照して判定し、該当行がデータロックされていないと判定した場合は、命令の内容に従ってデータベース記憶部20に記憶されている該当行の内容を書き換える機能を有する。
ロック制御部13は、SQL文解析部11が受け取ったSQL文が更新系の命令である場合には、データベース記憶部20に記憶されたデータの該当行がデータロックされているか否かを、データロック情報記憶部14に記憶されたロック二分木15を参照して判定し、新たにロック取得が可能である場合はロック二分木15に、取得するロックに対応する新たなノードを追加等する機能を有する。
[動作例]
図2に示すデータベース管理部10の動作例を説明する。図3はデータベース管理部10の主たる動作の一つである、SQL文実行処理の一例を示すフローチャートである。
SQL文実行処理において、データベース管理部10、より詳しくはSQL文解析部11はアプリケーションサーバ60からSQL文を受信する(S1)。
次にデータベース管理部10、より詳しくはSQL文解析部11は、受信したSQL文を解析して、そのSQL文により構成される命令が、データベースの更新を伴う更新系命令であるか否かを判定する(S2)。その命令が更新系命令でないと判定した場合(S2,No)、SQL文解析部11は、その命令をデータ制御部12に渡し、データ制御部12はその命令を実行し、その後SQL文実行処理を終了する。一方、その命令が更新系命令であると判定した場合(S2,Yes)、SQL文解析部11はデータ制御部12にその命令を渡す。
データ制御部12はその命令に基づいて、データベース30における更新対象の行を決定し(S3)、更新対象の行を特定する情報(例えば、行番号、レコード番号など)をロック制御部13に渡す。なお、更新対象の行が2以上ある場合には、未処理の行のうち一つの行を選択し、その選択した更新対象の行を特定する情報(例えば、行番号、レコード番号など)をロック制御部13に渡す。
ロック制御部13は、受け取った更新対象の行を特定する情報に基づいて、データロック情報記憶部14に記憶されているロック二分木15に、更新対象の行に対応するノードを追加して更新対象行のロックを行う(S4)。その後ロック制御部13はデータ制御部12に更新対象の行のロックが行われたことを通知する。
更新対象行のロックが行われたことを通知されたデータ制御部12は、データベース30における更新対象の行を前述の更新系命令の内容に基づいて書き換える(更新する)(S5)。
次に、データ制御部12は、ステップS3において決定された更新対象の行の全てがステップS4からステップS5で処理されたか否かを判定する(S6)。全ての更新対象の行がステップS4からステップS5で処理されていないと判定した場合(S6、No)、データ制御部12は更新対象の行のうち、未処理の行を一つ選択して、選択した行を特定する情報をロック制御部13に渡す。ロック制御部13は受け取った更新対象の行を特定する情報に基づいて、データロック情報記憶部14に記憶されているロック二分木15に、更新対象の行に対応するノードを追加して更新対象行のロックを行う(S4)。一方、ステップS6において、全ての更新対象の行がステップS4からステップS5で処理されたと判定した場合(S6、Yes)、データベース管理部10はSQL文実行処理を終了する。
[本実施の形態におけるロック二分木へのノードの加入]
次に、更新対象の行を新たにロックするために行う、ロック二分木15へのノードの追加を行うノード追加処理について説明する。ロック二分木は、通常、表ごとに一つ用意される。ロック二分木は、データベース毎に用意されてもよいし、表の一定数の行ごとに一つ、例えば、1−1000と1001−2000でそれぞれロック二分木が用意されてもよい。ここでは表ごとに用意されているものとして説明している。
図4は、ロック二分木15のノードに対応するオブジェクト(ロウロックオブジェクト:RowLockObject)のデータ構成例を示す図である。ロウロックオブジェクト4は、その属性情報(プロパティ)として、ロックを行う必要がある更新をデータベース装置に要求したユーザ(あるいはクライアント50)を特定する情報であるユーザ特定情報(図4中”Locker”と表記する)と、ロック対象行範囲の最小値を特定する情報である範囲最小値情報(図4中”To”と表記する)と、ロック対象行範囲の最大値を特定する情報である範囲最大値情報(図4中”From”と表記する)とを有する。さらに、自分の子ノードを特定する情報である左子ノード特定情報及び右子ノード特定情報を属性として有するのであるが、ここでは左子ノード特定情報及び右子ノード特定情報については省略する。
図5は、ロック二分木15に新たなノードが書き加えられた状態を示す図である。図5のロック二分木15は、初期状態においてルートノードN_0のみを有している状態として生成される。その後、SQL文解析部11がSQL文SQL1を受信したとする。このSQL文SQL1は、ユーザ名:U1であるユーザが行番号3以下の全ての行を更新することを意味している。
このSQL文SQL1に応じて、ロック制御部13は、ロウロックオブジェクト4_1を生成し、これをルートノードN_0の右子ノードとしてロック二分木15に追加する。ロウロックオブジェクト4_1の「ユーザ特定情報」は、”U1”であり、範囲最小値情報は”1”であり、範囲最大値情報は”3”に設定されている。このロウロックオブジェクト4_1は、ロック二分木15の構成要素として見た場合はノードN_1と見ることができる。
図6に、ロウロックオブジェクト4_1(ノードN_1)を、従来の技術におけるロウロックオブジェクトで示した場合のデータ構成例を示す。従来の技術におけるロウロックオブジェクトは、ユーザ特定情報と、ロック対象行を特定する情報であるロック対象行情報を有する。
本実施の形態との比較のため、ロウロックオブジェクト4_1を、従来の技術におけるロウロックオブジェクトで示した場合について図6を参照しながら説明する。従来の技術におけるロウロックオブジェクトを用いた場合、ユーザ特定情報を”U1"とし、ロック対象行情報を”2”とするロウロックオブジェクト4_P1と、ロウロックオブジェクト4_P1の左子ノードであって、ユーザ特定情報を”U1"とし、ロック対象行情報を”1”とするロウロックオブジェクト4_P2、及びロウロックオブジェクト4_P1の右子ノードであって、ユーザ特定情報を”U1"とし、ロック対象行情報を”3”とするロウロックオブジェクト4_P3との3つのロウロックオブジェクトで構成される。
これをノードとして捉えた場合、ノードN_P1と、ノードN_P1の左子ノードであるノードN_P2と、ノードN_P1の右子ノードであるノードN_P3で構成されていると見ることができる。
さて、図7に、図5の状態の後に新たなSQL文SQL2をデータベース管理部10が受信した場合のロック二分木15の例を示す。新たなSQL文SQL2の内容は、ユーザ”U1”が行番号4のレコードを更新するという内容である。
ロック制御部13は、このSQL文SQL2に応じて、新たなロウロックオブジェクト4_2を生成し、第1世代の子ノードN_1の右子ノードN_2としてロック二分木15に追加する。ロウロックオブジェクト4_2(ノードN_2)の「ユーザ特定情報」は、”U1”であり、範囲最小値情報は”4”であり、範囲最大値情報は”4”に設定されている。
次に、ロック制御部13は、2つのノード、ノードN_1とノードN_2を一つのノードに集約できるか否かを判定し、集約できる場合には、一方を削除し他方のみ残す。
本実施の形態において、2つのノードを一つのノードに集約してよい条件は
(1)2つのノードのユーザ特定情報が一致すること、及び
(2)2つのノードのロック対象行範囲を一つの連続したロック対象行範囲とすることができること、
の2つである。例えば、一方のノードのロック対象行範囲が10から12、もう一方のノードのロック対象行範囲が7から9である場合は、2つのノードのロック対象行範囲が一つの連続した行範囲である7から12となるので、この2つのノードは範囲最小値情報を”7”とし、範囲最大値情報を”12”とする一つのノードに集約することができる。
図7に示す例において、ロック制御部13は、ノードN_1とノードN_2とを一つに集約することが可能かどうか判定する。
判定は具体的には以下の通りである。
(1)2つのノードのユーザ特定情報は、ともに”U1”であり一致する
(2)2つのノードのロック対象行範囲は、”1から3”と、”4”であり、これらは一つの連続したロック対象行範囲”1から4”とすることができる。
よって、2条件が成立するため、ロック制御部13は、ノードN_1とノードN_2とを一つに集約すること可能と判定し、ノードN_1の範囲最大値情報を”3”から”4”に書き換えるとともに、ノードN_2は削除する。図8にノードN_1の範囲最大値情報を書き換えるとともに、ノードN_2を削除した状態のロック二分木15を示す。
次に、図8の状態の後に新たなSQL文SQL3をデータベース管理部10が受信した場合のロック二分木15の例を図9に示す。新たに受信したSQL文SQL3の内容は、ユーザ”U1”が行番号10のレコードを更新するという内容である。
ロック制御部13は、このSQL文SQL3に応じて、新たなロウロックオブジェクト4_3を生成し、これを第1世代の子ノードN_1の右子ノードN_3としてロック二分木15に追加する。追加されたロウロックオブジェクト4_3の「ユーザ特定情報」は、”U1”であり、範囲最小値情報は”10”であり、範囲最大値情報は”10”に設定されている。
図9に示すロック二分木15において、ロック制御部13は、ノードN_1とノードN_3とを一つに集約することが可能かどうか判定する。
判定は具体的には以下の通りである。
(1)2つのロウロックオブジェクトのユーザ特定情報は、ともに”U1”であり一致する
(2)2つのロウロックオブジェクトのロック対象行範囲は、”1から4”と、”10”であり、これらは一つの連続したロック対象行範囲とはならない。
よって、条件(2)は不成立のため、ロック制御部13は、ノードN_1とノードN_3とを一つに集約することが不可能と判定する。
次に、上記図9の状態の後に新たなSQL文SQL4をデータベース管理部10が受信した場合のロック二分木15の例を図10に示す。新たに受信したSQL文SQL4の内容は、ユーザ”U1”が行番号6、7、8それぞれのレコードを更新するという内容である。
ロック制御部13は、このSQL文SQL4に応じて、新たなロウロックオブジェクト4_4を生成し、これを第2世代の子ノードN_3の左子ノードN_4としてロック二分木15に追加する。追加されたノードN_4であるロウロックオブジェクト4_4の「ユーザ特定情報」は、”U1”であり、範囲最小値情報は”6”であり、範囲最大値情報は”8”に設定されている。
上記図10に示すロック二分木15において、ロック制御部13は、ノードN_3とノードN_4を一つに集約することが可能かどうか判定する。
判定は具体的には以下の通りである。
(1)2つのロウロックオブジェクトのユーザ特定情報は、ともに”U1”であり一致する
(2)2つのロウロックオブジェクトのロック対象範囲は、”10”と、”6から8”であり、これらは一つの連続したロック対象行範囲とはならない。
よって、条件(2)は不成立のため、ロック制御部13は、ノードN_3とノードN_4とを一つに集約することが不可能と判定する。
上記図10に示すロック二分木15において、ロック制御部13は、さらにノードN_1とノードN_4とを一つに集約することは可能かどうか判定する。
判定は具体的には以下の通りである。
(1)2つのノードであるロウロックオブジェクトのユーザ特定情報は、ともに”U1”であり一致する
(2)2つのノードであるロウロックオブジェクトのロック対象行範囲は、”1から4”と、”6から8”であり、これらは一つの連続したロック対象行範囲とはならない。
よって、条件(2)は不成立のため、ロック制御部13は、さらにノードN_1とノードN_4とを一つに集約することは不可能と判定し、ロック二分木15に変更を加えない。
次に、図10の状態の後に新たなSQL文SQL5をデータベース管理部10が受信した場合のロック二分木15の例を図11に示す。新たに受信したSQL文SQL5の内容は、ユーザ”U1”が行番号9のレコードを更新するという内容である。
ロック制御部13は、このSQL文SQL5に応じて、新たなロウロックオブジェクト4_5を生成し、これを第3世代の子ノードN_4の右子ノードN_5としてロック二分木15に追加する。追加されたノードN_5であるロウロックオブジェクト4_5の「ユーザ特定情報」は、”U1”であり、範囲最小値情報は”9”であり、範囲最大値情報は”9”に設定されている。
上述の図11に示すロック二分木15において、ロック制御部13は、ノードN_5とノードN_4を一つに集約することが可能かどうか判定する。
判定は具体的には以下の通りである。
(1)2つのノードに対応するロウロックオブジェクトのユーザ特定情報は、ともに”U1”であり一致する
(2)2つのノードに対応するロウロックオブジェクトのロック対象行範囲は、”6から8”と、”9”であり、これらは一つの連続したロック対象行範囲”6から9”となる。
よって、2条件が成立するので、ロック制御部13は、ノードN_5とノードN_4とを一つに集約することが可能と判定し、ノードN_4の範囲最大値情報を”8”から”9”に書き換えるとともに、ノードN_5は削除する。図12にノードN_4の範囲最大値情報を書き換えるとともに、ノードN_5を削除した状態のロック二分木15を示す。
図12に示すロック二分木15において、ロック制御部13は、ノードN_4とノードN_3とを一つに集約することが可能かどうか判定する。
判定は具体的には以下の通りである。
(1)2つのロウロックオブジェクトのユーザ特定情報は、ともに”U1”であり一致する
(2)2つのロウロックオブジェクトのロック対象行範囲は、”6から9”と”10”であり、これらは一つの連続したロック対象行範囲”6から10”とすることができる。
よって、2条件が成立するので、ロック制御部13は、ノードN_4とノードN_3とを一つに集約することが可能と判定し、ノードN_3であるロウロックオブジェクト4_3の範囲最小値情報を”10”から”6”に書き換えるとともに、ノードN_4は削除する。図13に、ノードN_3であるロウロックオブジェクト4_3の範囲最小値情報を書き換えるとともに、ノードN_4を削除した状態のロック二分木15を示す。
次に、図13の状態の後にデータベース管理部10が新たなSQL文SQL6を受信した場合のロック二分木15の例を図14に示す。新たに受信したSQL文SQL6の内容は、ユーザ”U1”が行番号5のレコードを更新するという内容である。
ロック制御部13は、このSQL文SQL6に応じて、新たなロウロックオブジェクト4_6を生成し、これを第3世代の子ノードN_3の右子ノードとしてロック二分木15に追加する。追加されるノードN_6であるロウロックオブジェクト4_6の「ユーザ特定情報」は、”U1”であり、範囲最小値情報は”5”であり、範囲最大値情報は”5”に設定されている。
次に、図14に示すロック二分木15において、ロック制御部13は、ノードN_6とノードN_3とを一つに集約することが可能かどうか判定する。
判定は具体的には以下の通りである。
(1)2つのノードであるロウロックオブジェクトのユーザ特定情報は、ともに”U1”であり一致する
(2)2つのノードであるロウロックオブジェクトのロック対象行範囲は、”6から10”と、”5”であり、これらは一つの連続したロック対象行範囲”5から10”とすることができる。
よって、2条件が成立するので、ロック制御部13は、ノードN_6とノードN_3とを一つに集約することが可能と判定し、ノードN_3であるロウロックオブジェクト4_3の範囲最小値情報を”6”から”5”に書き換えるとともに、ノードN_6は削除する。図15に、ノードN_3であるロウロックオブジェクト4_3の範囲最小値情報を書き換えるとともに、ノードN_6を削除した状態のロック二分木15を示す。
次に、図15に示すロック二分木15において、ロック制御部13は、ノードN_3とノードN_1とを一つに集約することが可能かどうか判定する。
判定は具体的には以下の通りである。
(1)2つのノードであるロウロックオブジェクトのユーザ特定情報は、ともに”U1”であり一致する
(2)2つのノードであるロウロックオブジェクトのロック対象行範囲は、”1から4”と、”5から10”であり、これらは一つの連続した行範囲”1から10”とすることができる。
よって、2条件が成立するので、ロック制御部13は、ノードN_3とノードN_1とを一つに集約することが可能と判定し、ノードN_1であるロウロックオブジェクト4_1の範囲最大値情報を”4”から”10”に書き換えるとともに、ノードN_3は削除する。図16にノードN_1であるロウロックオブジェクト4_1の範囲最大値情報を書き換えるとともに、ノードN_3を削除した状態のロック二分木15を示す。この状態において、ロック二分木15は、ユーザ”U1”が行番号1から10までのレコード(行)について、ロックを取得したことを記録していることになる。
[ロウロックオブジェクトのデータ構成例]
次に、ロウロックオブジェクトの構成例について説明する。
[従来のロウロックオブジェクトのデータ構成例]
図17に、従来の技術におけるロウロックオブジェクトのデータ構成例を示す。図17には、ノードN_P10に対応し、ロック対象行の行番号「13」とするロウロックオブジェクト4_P10と、ノードN_P10の左子ノードN_P11に対応し、ロック対象行の行番号「10」とするロウロックオブジェクト4_P11と、ノードN_P10の右子ノードに対応し、ロック対象行の行番号「15」とするロウロックオブジェクト4_P12とを示している。
従来の技術では、各ロウロックオブジェクトは、ロック対象行を特定する情報であるロック対象行情報1701(図中"Value"とする)と、そのロウロックオブジェクトの左子ノードを特定する情報である、左子ノード特定情報1702(図中"pLeft"とする)と、そのロウロックオブジェクトの右子ノードを特定する情報である、右子ノード特定情報1703(図中"pRight"とする)とを有している。左子ノード特定情報1702、右子ノード特定情報1703は、例えば該当するロウロックオブジェクトを示すポインタである。従来技術のロウロックオブジェクトは、ロウロックオブジェクト一つにつき、ロック対象行を一つしか扱えない。
[本実施の形態のロウロックオブジェクトのデータ構成例]
図18に、本実施の形態におけるロウロックオブジェクトのデータ構成例を示す。図18には、図17と同様に、ノードN_10に対応する、ロック対象行の行番号「13」とするロウロックオブジェクト4_10と、ノードN_10の左子ノードN_11であり、ロック対象行の行番号「10」とするロウロックオブジェクト4_11と、ノードN_10の右子ノードN_12であり、ロック対象行の行番号「15」とするロウロックオブジェクト4_12とを示している。
本実施の形態では、各ロウロックオブジェクトは、ロック対象行情報に範囲を持たせたことを特徴とする。すなわち、従来の技術ではロック対象行を特定する情報はロック対象行情報1701のみであったのに対して、本実施の形態では、ロック対象行範囲の最小値を特定する情報である範囲最小値情報1800(図中"VL"とする)と、ロック対象行範囲の最大値を特定する情報である範囲最大値情報1801(図中"VR"とする)とを有する。よって、一つのロウロックオブジェクトで複数のロック対象行を扱えるようになる。なお、本実施の形態にかかるロウロックオブジェクトは、さらにそのロウロックオブジェクトの左子ノードを特定する情報である、左子ノード特定情報1802(図中"pLeft"とする)と、そのロウロックオブジェクトの右子ノードを特定する情報である、右子ノード特定情報1803(図中"pRight"とする)とを有している。左子ノード特定情報1802、右子ノード特定情報1803は、例えば該当するロウロックオブジェクトを示すポインタである。これは、従来の技術と同様である。また、本実施の形態にかかるロウロックオブジェクトはユーザ特定情報(図略)をその構成要素として有している。
図19に、ロック対象行範囲が行番号11から行番号13までである場合の、従来の技術におけるロウロックオブジェクト4のデータ構成例を示す。従来の技術においては、ロック対象行の行番号「12」とするロウロックオブジェクト4_P10と、ロウロックオブジェクト4_P10であるノードN_P10の左子ノードN_P11となる、ロック対象行を行番号「11」とするロウロックオブジェクト4_P11と、ロウロックオブジェクト4_P10であるノードN_P10の右子ノードN_P12であり、ロック対象行を行番号「13」とするロウロックオブジェクト4_P12との、3つのロウロックオブジェクト4からなる二分木が必要となる。
一方、本実施の形態におけるロウロックオブジェクト4を使用して、ロック対象行の範囲が行番号11から行番号13までである場合の、ロウロックオブジェクト4のデータ構成例を示す。図20に、本実施の形態におけるロウロックオブジェクトを使用した場合、一つのロウロックオブジェクト4_13のみでロック対象行範囲を行番号11から行番号13(すなわち、行番号11、行番号12、行番号13の3行分)とすることを記述できることを示す。ロウロックオブジェクト4_13の範囲最小値情報1800には、値「11」が格納され、範囲最大値情報1801には、値「13」が格納されている。これは、ノードN_13のみで、図19に示した3つのノード、ノードN_P10、N_P11、N_P12と同一の内容を記述できることを意味する。
[ノードN(ロウロックオブジェクト4)の追加]
次に、ロック二分木へのノードの追加はどのように行われるのかについて述べる。まず、従来の技術におけるノードの追加を説明する。図21は、図17に示したロック二分木15に新たにロック対象行の行番号を「11」とするノードN_P14(ロウロックオブジェクト4_P14)が追加された状態を示す図である。図21に示す例では、葉ノードであるノードN_P11(ロウロックオブジェクト4_P11)及びノードN_P12(ロウロックオブジェクト4_P12)のうち、「11」に近いロック対象行1701の値を有するノードN_P11(ロウロックオブジェクト4_P11)に新たなノードN_P14(ロウロックオブジェクト4_P14)が子ノードとして追加される。親ノードであるノードN_P11(ロウロックオブジェクト4_P11)のロック対象行1701の値は「10」であり、追加される新たなノードN_P14(ロウロックオブジェクト4_P14)のロック対象行1701の値「11」で、値「10」より大きいので、親ノードであるノードN_P11(ロウロックオブジェクト4_P11)の右子ノードとして追加される。すなわち、親ノードであるノードN_P11(ロウロックオブジェクト4_P11)の右子ノード特定情報1703に、追加された新たなノードN_P14(ロウロックオブジェクト4_P14)を特定する情報が格納される。
次に、本実施の形態におけるロウロックオブジェクトの追加を説明する。図22は、図18に示したロック二分木15に新たにロック対象行の行番号を「11」とするノードN_14(ロウロックオブジェクト4_14)が追加された状態を示す図である。図22に示す例では、葉ノードであるノードN_11(ロウロックオブジェクト4_11)及びノードN_12(ロウロックオブジェクト4_12)のうち、「11」に近いロック対象行範囲、より詳しくは範囲最小値情報1800の値又は範囲最大値情報1801の値を有するノードN_11(ロウロックオブジェクト4_11)に新たなノードN_14(ロウロックオブジェクト4_14)が子ノードとして追加される。すなわち、図22に示す例では、親ノードとして選択されたノードN_11(ロウロックオブジェクト4_11)の右子ノード特定情報1803に、追加された新たなノードN_14(ロウロックオブジェクト4_14)を特定する情報が格納される。
[ノードの集約]
本実施の形態では、異なる2つのノードN(ロウロックオブジェクト4)のロック対象行範囲が連続する一つの範囲に結合可能な場合、これら2つのノードN(ロウロックオブジェクト4)を一つのノードN(ロウロックオブジェクト4)に集約することができる。図23Aに、図22に示したノードN_14(ロウロックオブジェクト4_14)とノードN_11(ロウロックオブジェクト4_11)とを集約した状態の例を示す。集約される前のノードN_11(ロウロックオブジェクト4_11)の範囲最大値情報1801は「10」であり、集約される前のノードN_14(ロウロックオブジェクト4_14)の範囲最小値情報1800は「11」であるので、この2つのロウロックオブジェクト4のロック対象行範囲「10から11まで」という一つのロック対象行範囲とすることができる。
2つのノードN(ロウロックオブジェクト4)を集約する処理であるノード集約処理は、2つのノードNのうち下位のノードNは削除し、上位のノードの範囲最小値情報1800及び/又は範囲最大値情報1801を書き換えることにより行われる。図23の例では、一つのロック対象行範囲「10から11まで」を示すように、上位のノードN_11(ロウロックオブジェクト4_11)の範囲最大値情報1801の値が「10」から「11」に書き換えられ、ノードN_14(ロウロックオブジェクト4_14)は削除される。これで、2つのノードN_14、N_11を集約する処理が完了する。
図23Bにノード集約処理の一例を示すフローチャートを掲げる。以下、このフローチャートを参照しながら、ノード集約処理の内容を説明する。
ノード集約処理において、データベース装置2、より詳しくはロック制御部13は、ロック二分木15に新規登録したノードをNとする(S23B_1)。次にデータベース装置2、より詳しくはロック制御部13は、Nの親ノードがロック二分木15に存在するか否かを判定する(S23B_2)。親ノードが存在しないと判定した場合(S23B_2,No)、データベース装置2、より詳しくはロック制御部13はノード集約処理をそのまま終了する。一方、親ノードが存在すると判定した場合(S23B_2,Yes)、データベース装置2、より詳しくはロック制御部13はNの親ノードをPとする(S23B_3)。
次に、データベース装置2、より詳しくはロック制御部13はNをPに集約(マージ)できるか否かを判定する(S23B_4)。NをPに集約(マージ)できると判定した場合(S23B_4、Yes)、データベース装置2、より詳しくはロック制御部13は集約の結果残ったPを新たなNとし(S23B_5)、後述するステップS23B_6に進む。一方、NをPに集約(マージ)できないと判定した場合(S23B_4、No)、データベース装置2、より詳しくはロック制御部13は前述のステップS23B_5を行わずに後述するステップS23B_6に進む。
ステップS23B_6において、データベース装置2、より詳しくはロック制御部13はPの親ノードがロック二分木15に存在するか否かを判定する(S23B_6)。Pの親ノードがロック二分木15に存在しないと判定した場合(S23B_6、No)、データベース装置2、より詳しくはロック制御部13はそのままノード集約処理を終了する。一方、Pの親ノードがロック二分木15に存在すると判定した場合(S23B_6、Yes)、データベース装置2、より詳しくはロック制御部13はPの親ノードを新たなPとし(S23B_7)、その後前述のステップS23B_4に戻って、ノード集約処理を続行する。
以上で、ノード集約処理の内容の説明を終了する。
図23Cに、ノード集約処理の対象となるノードの例を示す。図23Cに示したロック二分木は、ノードA1と、ノードA1の子ノードであるノードA2及びノードAX、ノードA2の子ノードであるノードA3及びノードAY、ノードA3の子ノードであるノードA4から構成されており、ノードA4の子ノードとして、ノードA5が新規登録された。
この例では、新規登録されたA5、あるいはA5やその後集約の結果残ったノードと集約の相手とされるのは、A4,A3,A2、A1の親子関係を有するノードであって、兄弟関係であるノードAX,AYは集約の対象とはされない。
本実施の形態のように、2つのノードN(ロウロックオブジェクト4)を集約する処理であるノード集約処理を行うことが可能とすると、以下のような利点が得られる。
図24は、あるロック二分木15を示す図である。このロック二分木15についてノード集約処理を行った結果、図25に示すロック二分木15が生成されたものとする。
ノードを集約する処理を行う前のロック二分木15(図24参照)において、新たなノードをロック二分木15に追加するには、ルートノードN_0から最下層のノードN_Bottomまで5ノードの探索が必要であるが、ノードを集約する処理を行った後のロック二分木15(図25参照)においては、新たなノードを追加するには、ルートノードN_0から最下層のノードN_Bottomまで2ノード探索すればよい。
また、ノードを集約する処理を行う前の状態(図24参照)でロック二分木15を記憶するには、少なくとも11ノードN(ロウロックオブジェクト4)分の記憶容量が必要となるのに対して、ノードを集約する処理を行った後の状態(図25参照)では、ロック二分木15を記憶するには4ノードN(ロウロックオブジェクト4)分の記憶容量で足りる。このように、ノードを集約する処理が可能となることで、ノードの追加、探索などの処理量を低減させることが可能となるとともに、ロック二分木15を記憶するために必要な記憶容量を減少させることも可能となる。
[第1の実施例]
次に、本実施の形態の第1の実施例について説明する。第1の実施例は、ロック対象行を範囲で管理することを特徴とする。
第1の実施例にかかるマルチユーザ・データベースシステム1、データベース装置2、データベース管理部10の構成は、前述の第1の実施の形態と同じ(図1、図2参照)であり、第1の実施例にかかるデータベース管理部10の動作例も前述の第1の実施の形態と同じ(図3参照)であるので、マルチユーザ・データベースシステム1、データベース装置2、データベース管理部10の構成及びその動作については、説明を省略する。
[ロック二分木へのノード追加方法]
ここで、ロック制御部13が新たなデータをロックする処理(図3、S4参照)において、更新対象の行に対応するノードNをロック二分木15に加える処理であるノード追加処理について述べる。
図26は、ノード追加処理の一例を示すフローチャートである。なお、図26において、「P」は、現在処理対象としているロック二分木に属するノードN(ターゲットノードと呼ぶ;ロウロックオブジェクト4)を示す情報であり、「k」はノードN(ロウロックオブジェクト4)に対応するユーザを示す情報であり、「v」は新たにロックを取得したい行番号(以下、「追加ロック対象行番号」という)を示す情報である。
ノード追加処理を開始すると、ロック制御部13は現在の処理対象とするノードN(ロウロックオブジェクト4)を示す情報Pが空か否かを判定する(S2601)。ノードN(ロウロックオブジェクト4)を示す情報Pが空であると判定した場合(S2601、Yes)、現在の処理対象とするノードN(ロウロックオブジェクト4)を示す情報Pに、更新対象として更新を要求された行に対応する新たなノードN(ロウロックオブジェクト4)を追加し(S2602)、その後ノード追加処理を終了する。
一方、現在の処理対象とするノードN(ロウロックオブジェクト4)が存在する(空でない)と判定した場合(S2601、No)、ロック制御部13はそのノードN(ロウロックオブジェクト4)の範囲最大値情報(1801)vRが追加ロック対象行番号vより小さいか否かを判定する(S2603)。
範囲最大値情報vRが追加ロック対象行番号vより小さいと判定した場合(S2603、Yes)、ロック制御部13はそのノードN(ロウロックオブジェクト4)の右子ノード特定情報(1803)pRが空(NULL)であるか否かを判定する(S2604)。右子ノード特定情報pRが空(NULL)であると判定した場合(S2604、Yes)、ロック制御部13は、現在処理対象のノードの右子ノード特定情報に、更新対象として更新を要求された行に対応する新たなノードN(ロウロックオブジェクト4)を追加し(S2609)、その後ノード追加処理を終了する。
一方、ステップS2604において右子ノード特定情報pRが空(NULL)でないと判定した場合(S2604、No)、ターゲットノードを示す変数Pに右子ノード特定情報pRを代入する(S2605)。これで、新たなターゲットノードは現在のターゲットノードからその右子ノードに変更される。その後ステップS2603に戻りノード追加処理が続行される。
前述のステップS2603の説明に戻る。ステップS2603において、範囲最大値情報vRが追加ロック対象行番号vより小さくないと判定した場合(S2603、No)、ロック制御部13は、ターゲットノードN(ロウロックオブジェクト4)の範囲最小値情報(1800)vLが追加ロック対象行番号vより大きいか否かを判定する(S2606)。範囲最小値情報vLが追加ロック対象行番号vより大きくないと判定した場合(S2606、No)、ロック制御部13はターゲットノードN(ロウロックオブジェクト4)のユーザ特定情報kと、ノード追加を要求しているユーザとが一致するか否かを判定する(S2610)、ターゲットノードN(ロウロックオブジェクト4)のユーザ特定情報kと、ノード追加を要求しているユーザとが一致すると判定した場合(S2610、Yes)、ロック制御部13はそのユーザkによる行番号vのデータの更新を許可する(S2612)。その後ロック制御部13はノード追加処理を終了する。一方、ターゲットノードN(ロウロックオブジェクト4)のユーザ特定情報kと、ノード追加を要求しているユーザとが一致しないと判定した場合(S2610、No)、ロック制御部13はそのユーザkによる行番号vのデータの更新を許可しない(S2611)。その後ロック制御部13はノード追加処理を終了する。
前述のステップS2606の説明に戻る。ステップS2606において、範囲最小値情報(1802)vLが追加ロック対象行番号vより大きいと判定した場合(S2606、Yes)、ロック制御部13はそのノードN(ロウロックオブジェクト4)の左子ノード特定情報pLが空(NULL)であるか否かを判定する(S2607)。左子ノード特定情報pLが空(NULL)であると判定した場合(S2607、Yes)、ロック制御部13は、現在処理対象のノードの左子ノードとして、新たなノードを追加する(S2613)。その後ロック制御部13はノード追加処理を終了する。
一方、ステップS2607において右子ノード特定情報pLが空(NULL)でないと判定した場合(S2607、No)、ターゲットノードを示す変数Pに左子ノード特定情報pLを代入する。これで、新たなターゲットノードは現在のターゲットノードからその左子ノードに変更される。その後ステップS2603に戻りノード追加処理が続行される。
[ノード追加処理の具体例]
ノード追加処理の具体例を示す。図27は、ロック二分木15の一例を示す図である。このロック二分木15は、ノード追加処理が行われる前においてノードN_27_1からノードN_27_4で構成されているとする。ノードN_27_1は、ユーザ特定情報を「k1」とし、範囲最小値情報1800を「20」、範囲最大値情報1801を「21」とするロウロックオブジェクト4である。ノードN_27_2は、ユーザ特定情報を「k1」とし、範囲最小値情報1800を「11」、範囲最大値情報1801を「12」とするロウロックオブジェクト4であり、ノードN_27_1の左子ノードである。ノードN_27_3は、ユーザ特定情報を「k2」とし、範囲最小値情報1800を「16」、範囲最大値情報1801を「18」とするロウロックオブジェクト4であり、ノードN_27_2の右子ノードである。ノードN_27_4は、ユーザ特定情報を「k1」とし、範囲最小値情報1800を「14」、範囲最大値情報1801を「15」とするロウロックオブジェクト4であり、ノードN_27_3の左子ノードである。
ここで、ユーザ「k1」から行番号13についての新たな更新要求2701があり、この更新要求2701に応じて行番号13についてロックを行うためのノード追加処理が行われるものとする。このノード追加処理において、当初のターゲットノードはノードN_27_1に設定されるので、処理は前述のステップS2603に進む(S2601,Yes)。ステップS2603において、ノードN_27_1の範囲最大値情報1801vR(=21)は入力値v(=13)より小さくないので、ステップS2606に進む(S2603、No)。ステップS2606において、ノードN_27_1の範囲最小値情報1800vL(=20)は入力値v(=13)より大きいので、ステップS2607に進む(S2606,Yes)。ステップS2607において、ノードN_27_1の左子ノード特定情報pL(=ノードN_27_2)は空(NULL)でないので、ステップS2608に進む(S2607、No)。ステップS2608において、ターゲットPにノードN_27_1の左子ノード特定情報pL(=ノードN_27_2)が代入される。これで新たなターゲットはノードN_27_2となる。
処理は再びステップS2603に戻る。ステップS2603において、ノードN_27_2の範囲最大値情報1801vR(=12)は入力値v(=13)より小さいので、ステップS2604に進む(S2603、Yes)。ステップS2604において、ノードN_27_2の右子ノード特定情報pR(=ノードN_27_3)は空(NULL)でないので、ステップS2605に進む(S2604、No)。ステップS2605において、ターゲットPにノードN_27_2の右子ノード特定情報pR(=ノードN_27_3)が代入される。これで新たなターゲットPはノードN_27_3となる。
処理はまた再びステップS2603に戻る。ステップS2603において、ノードN_27_3の範囲最大値情報1801vR(=18)は入力値v(=13)より小さくないので、ステップS2606に進む(S2603、No)。ステップS2606において、ノードN_27_3の範囲最小値情報1800vL(=16)は入力値v(=13)より大きいので、ステップS2607に進む(S2606,Yes)。ステップS2607において、ノードN_27_3の左子ノード特定情報pL(=ノードN_27_4)は空(NULL)でないので、ステップS2608に進む(S2607、No)。ステップS2608において、新たなターゲットPにノードN_27_3の左子ノード特定情報pL(=ノードN_27_4)が代入される。これで新たなターゲットPはノードN_27_4となる。
処理は再度ステップS2603に戻る。ステップS2603において、ノードN_27_4の範囲最大値情報1801vR(=15)は入力値v(=13)より小さくないので、ステップS2606に進む(S2603、No)。ステップS2606において、ノードN_27_4の範囲最小値情報1800vL(=14)は入力値v(=13)より大きいので、ステップS2607に進む(S2606,Yes)。ステップS2607において、ノードN_27_4の左子ノード特定情報pL(=ノードN_27_4)は空(NULL)なので、ステップS2608に進む(S2607、Yes)。ステップS2609において、ノードN_27_4の左子ノード特定情報pL(=ノードN_27_4)に、ユーザ「k1」による行番号「13」に関する更新要求に対応するノードN_27_5を特定する情報が格納される。これによりノードN_27_1からノードN_27_4で構成されたロック二分木15に新たなノードN_27_5が追加されたことになる。
[ノード集約処理の具体例]
ロック制御部13は、図26に示したロック二分木15に含まれるノードNについて、ノード集約処理を実行する。
まず、ロック制御部13は、葉ノードであるノードN_27_5と、その親ノードであるノードN_27_4とを一つの連続したロック対象行範囲を有するノードに集約できるか否かを判断する。図28に、葉ノードであるノードN_27_5と、その親ノードであるノードN_27_4との集約が判断されている状態を示す。
まず、ノードN_27_5のユーザ特定情報は「k1」であり、もう一方のノードN_27_4のユーザ特定情報も「k1」であり、両者のユーザ特定情報は一致するので、集約可能条件を満たすとロック制御部13は判断する。
次にロック制御部13は、葉ノードであるノードN_27_5のロック対象行範囲は「13、13」であり、ノードN_27_4のロック対象行範囲は「14、15」であることから、この2つのロック対象行範囲は、一つの連続したロック対象行範囲「13、15」を構成するので、ロック制御部13は、下位ノードであるノードN_27_5を削除するとともに、ノードN_27_4のロック対象行範囲を「14、15」から「13、15」に書き換えることにより、ノードN_27_5とノードN_27_4との集約を完了する。図29に、葉ノードであるノードN_27_5と、その親ノードであるノードN_27_4との集約が完了した状態を示す。なお、図中点線で示されているノードN_27_5は、削除済みであることを意味する。
ロック制御部13は、ノードN_27_5とノードN_27_4との集約が完了したのち、さらにノード集約処理を続行する。ロック制御部13は、更新されたノードであるノードN_27_4と、その親ノードであるノードN_27_3とを一つの連続したロック対象行範囲を有するノードに集約できるか否かを判断する。
ロック制御部13は、ノードN_27_4のユーザ特定情報は「k1」であり、もう一方のノードN_27_3のユーザ特定情報jは「k2」であり、両者のユーザ特定情報は一致しないので、集約可能条件を満たさないとロック制御部13は判断する。
ロック制御部13は、ノードN_27_4とノードN_27_3との集約は不可能であると判断したのち、さらにノード集約処理を続行する。
ロック制御部13は、葉ノードであるノードN_27_4と、その親ノードの親ノードであるノードN_27_2とを一つの連続したロック対象行範囲を有するノードに集約できるか否かを判断する。図30に、葉ノードであるノードN_27_5と、その2世代上のノードN_27_2との集約が判断されている状態を示す。
ロック制御部13は、ノードN_27_4のユーザ特定情報は「k1」であり、もう一方のノードN_27_2のユーザ特定情報も「k1」であり、両者のユーザ特定情報は一致するので、集約可能条件を満たすとロック制御部13は判断する。
次にロック制御部13は、葉ノードであるノードN_27_4のロック対象行範囲は「13、15」であり、ノードN_27_2のロック対象行範囲は「11、12」であることから、この2つのロック対象行範囲は、一つの連続したロック対象行範囲「11、15」を構成するので、ロック制御部13は、下位ノードであるノードN_27_4を削除するとともに、ノードN_27_2のロック対象行範囲を「11、12」から「11、15」に書き換えることにより、ノードN_27_4とノードN_27_2との集約を完了する。図31に、葉ノードであるノードN_27_4と、その2世代上のノードであるノードN_27_2との集約が完了した状態を示す。なお、図中点線で示されているノードN_27_4は、削除済みであることを意味する。
ロック制御部13は、同様に更新されたノードであるノードN_27_2と、その親ノードの親ノードであるノードN_27_1についても同様にノードの集約を試みるが、集約不可能であり、ロック二分木の頂点まで集約処理を実施したので、ロック制御部13は、ロック二分木15についてのノード集約処理を図31の状態で終了する。
[第2の実施例]
次に第2の実施例について説明する。第2の実施例の特徴は、ロック対象行を範囲で取り扱うことを可能とする点にある。
第2の実施例にかかるマルチユーザ・データベースシステム1、データベース装置2、データベース管理部10の構成は、前述の第1の実施の形態と同じ(図1、図2参照)であるので、構成の詳細な説明は省略する。
第2の実施例にかかるデータベース管理部10の動作例を説明する。図32はデータベース管理部10の主たる動作の一つである、SQL文実行処理の一例を示すフローチャートである。
SQL文実行処理において、データベース管理部10、より詳しくはSQL文解析部11はアプリケーションサーバ60からSQL文を受信する(S3201)。
次にデータベース管理部10、より詳しくはSQL文解析部11は、受信したSQL文を解析して、そのSQL文が構成する命令が、データベースの更新を伴う更新系命令であるか否かを判定する(S3202)。その命令が更新系命令でないと判定した場合(S3202,No)、SQL文解析部11は、その命令をデータ制御部12に渡し、データ制御部12はその命令を実行し(S3207)、その後SQL文実行処理を終了する。一方、その命令が更新系命令であると判定した場合(S3202,Yes)、SQL文解析部11はデータ制御部12にその命令を渡す。
データ制御部12はその命令に基づいて、データベース30における更新対象の行を決定し(S3203)、さらに更新対象の行が複数である場合に複数の更新対象の行を一つの連続した範囲として集約することが可能か否かを判定し、可能であれば、一つの連続した範囲を決定する。更新対象の行を特定する情報(例えば、行番号又はその範囲、レコード番号又はその範囲など、)をロック制御部13に渡す。例えば、データ制御部12はWhere条件やINDEXなどを使い、更新対象の行を集約する。例えば、更新対象の行が1から10までであるとすると、更新対象の行範囲を「1、10」として扱うようにして良い。この行範囲は範囲最小値情報vL=1、範囲最大値情報vR=10とするロウロックオブジェクト4などとして生成される。
ロック制御部13は、受け取った更新対象の行範囲を特定する情報に基づいて、データロック情報記憶部14に記憶されているロック二分木15に、更新対象の行範囲に対応するノードN(ロウロックオブジェクト4)を加えて該当行範囲のロックを行う(S3204)。その後ロック制御部13はデータ制御部12に更新対象の行範囲のロックが行われたことを通知する。
更新対象の行範囲のロックが行われたことを通知されたデータ制御部12は、データベース30における更新対象の行範囲のデータを前述の更新系命令の内容に基づいて書き換える(更新する)(S3205)。
次に、データ制御部12は、ステップS3203において決定された更新対象の行が全てステップS3204からステップS3205で処理されたか否かを判定する(S3206)。全ての更新対象の行範囲がステップS3204からステップS3205で処理されていないと判定した場合(S3206、No)、データ制御部12は更新対象の行範囲のうち、未処理の行範囲を一つ選択して、選択した行範囲を特定する情報をロック制御部13に渡す。ロック制御部13は受け取った更新対象の行範囲を特定する情報に基づいて、データロック情報記憶部14に記憶されているロック二分木15に、更新対象の行範囲に対応するノードNを加えて該当行のロックを行う(S3204)。一方、ステップS3206において、全ての更新対象の行がステップS3204からステップS3205で処理されたと判定した場合(S3206、Yes)、データベース管理部10はSQL文実行処理を終了する。
[ロック二分木へのノード追加処理]
ここで、ロック制御部13が該当の行をロックする処理(S3204参照)において、更新対象の行に対応するノードNをロック二分木15に加える処理であるノード追加処理について述べる。
図33は、ノード追加処理の例を示すフローチャートである。なお、図33において、「P」は、現在処理対象としているロック二分木に属するノードN(ロウロックオブジェクト4)を示す情報であり、「k」はノードN(ロウロックオブジェクト4)に対応するユーザを示す情報であり、「vR」は行範囲中の最大値を示す情報である範囲最大値情報1801であり、「vL」は行範囲中の最小値を示す情報である範囲最小値情報1800である。また、「pL」は左子ノード特定情報1802であり、「pR」は右子ノード特定情報1803である。
ノード追加処理を開始すると、ロック制御部13は現在の処理対象とするノードN(ロウロックオブジェクト4)を示す情報Pが空か否かを判定する(S3301)。ノードN(ロウロックオブジェクト4)を示す情報Pが空であると判定した場合(S3301、Yes)、現在の処理対象とするノードN(ロウロックオブジェクト4)を示す情報Pに、更新対象として更新を要求された行に対応する新たなノードN(ロウロックオブジェクト4)を追加し(S3302)、その後ノード追加処理を終了する。
一方、現在の処理対象とするノード(ロウロックオブジェクト;以下「現在処理対象ノードN(ロウロックオブジェクト4)」と呼ぶ)が存在する(空でない)と判定した場合(S3301、No)、ロック制御部13は現在処理対象ノードN(ロウロックオブジェクト4)の範囲最大値情報vRが更新対象ノードN(ロウロックオブジェクト4)の範囲最小値情報vLより小さいか否かを判定する(S3303)。
現在処理対象ノードN(ロウロックオブジェクト4)の範囲最大値情報vRが更新対象ノードN(ロウロックオブジェクト4)の範囲最小値情報vLより小さいと判定した場合(S3303、Yes)、ロック制御部13は現在処理対象ノードN(ロウロックオブジェクト4)の範囲最大値情報vRの右子ノード特定情報pRが空(NULL)であるか否かを判定する(S3304)。現在処理対象ノードN(ロウロックオブジェクト4)の右子ノード特定情報pRが空(NULL)であると判定した場合(S3304、Yes)、ロック制御部13は、現在処理対象ノードN(ロウロックオブジェクト4)の右子ノード特定情報pRに、更新対象ノードN(ロウロックオブジェクト4)を追加し(S3313)、その後ノード追加処理を終了する。
一方、ステップS3304において、現在処理対象ノードN(ロウロックオブジェクト4)の右子ノード特定情報pRが空(NULL)でないと判定した場合(S3304、No)、現在処理対象ノードN(ロウロックオブジェクト4)を示す変数Pに、現在処理対象ノードN(ロウロックオブジェクト4)の右子ノード特定情報pRを代入する(S3305)。これで、新たなターゲットノードは現在のターゲットノードからその右子ノードに変更される。その後ステップS3303に戻りノード追加処理が続行される。
前述のステップS3303の説明に戻る。ステップS3303において、現在処理対象ノードN(ロウロックオブジェクト4)の範囲最大値情報vRが更新対象ノードN(ロウロックオブジェクト4)の範囲最小値情報vLより小さくないと判定した場合(S3303、No)、ロック制御部13は、現在処理対象ノードN(ロウロックオブジェクト4)の範囲最小値情報vLが更新対象ノードN(ロウロックオブジェクト4)の範囲最大値情報vRより大きいか否かを判定する(S3306)。現在処理対象ノードN(ロウロックオブジェクト4)の範囲最小値情報vLが更新対象ノードN(ロウロックオブジェクト4)の範囲最大値情報vRより大きくないと判定した場合(S3306、No)、ロック制御部13は現在処理対象ノードN(ロウロックオブジェクト4)のユーザ特定情報kと、更新対象ノード追加を要求しているユーザとが一致するか否かを判定する(S3310)、現在処理対象ノードN(ロウロックオブジェクト4)のユーザ特定情報kと、更新対象ノード追加を要求しているユーザとが一致すると判定した場合(S3310、Yes)、ロック制御部13は現在処理対象ノードN(ロウロックオブジェクト4)を特定する情報Pを維持しながら、新たな更新対象ノードを生成するため以下の(1)(2)の処理をそれぞれ行う。
(1)更新対象ノードの範囲最小値情報vLをそのままとし、更新対象ノードの範囲最大値情報vRに現在処理対象ノードN(ロウロックオブジェクト4)の範囲最小値情報vLから1だけ減算した値を格納する。
(2)更新対象ノードの範囲最小値情報vLに現在処理対象ノードN(ロウロックオブジェクト4)の範囲最大値情報vRに1だけ加算した値を格納する。更新対象ノードの範囲最大値情報vRはそのままとする。
(1)(2)で生成された新たな更新対象ノードでそれぞれ、現在処理対象ノードNから処理を再開する。このとき、生成された更新対象ノードのvLとvRの関係が「vL<=vR」で無い場合は、すでにロック取得できていると判断できるので処理を行う必要が無い。
ステップS3312の後ロック制御部13はノード追加処理を終了する。
一方、ステップS3310においてターゲットノードN(ロウロックオブジェクト4)のユーザ特定情報kと、更新対象ノード追加を要求しているユーザとが一致しないと判定した場合(S3310、No)、ロック制御部13はそのユーザkによる行範囲のデータの更新を許可しない(S3311)。その後ロック制御部13はノード追加処理を終了する。
前述のステップS3306の説明に戻る。ステップS3306において、現在処理対象ノードN(ロウロックオブジェクト4)の範囲最小値情報vLが更新対象ノードN(ロウロックオブジェクト4)の範囲最大値情報vRより大きいと判定した場合(S3306、Yes)、ロック制御部13は現在処理対象ノードN(ロウロックオブジェクト4)の左子ノード特定情報pLが空(NULL)であるか否かを判定する(S3307)。左子ノード特定情報pLが空(NULL)であると判定した場合(S3307、Yes)、ロック制御部13は、現在処理対象ノードの左子ノードとして、更新対象ノードを追加する(S3309)。その後ロック制御部13はノード追加処理を終了する。
一方、ステップS3307において、現在処理対象ノードN(ロウロックオブジェクト4)の右子ノード特定情報pLが空(NULL)でないと判定した場合(S3307、No)、現在処理対象ノードを特定する情報Pに、現在処理対象ノードの左子ノード特定情報pLを代入する(S3308)。これで、新たな現在処理ノードは、現在処理ノードからその左子ノードに変更される。その後ステップS3303に戻りノード追加処理が続行される。
[ノード追加処理の具体例]
第2の実施例にかかるデータベース管理部10ノード追加処理の具体例を示す。
[具体例1]
図34に、ロック二分木15の例を示す。このロック二分木15は、以下のノードから構成されている。
ユーザ特定情報を「k1」とし、範囲最小値情報を「20」とし、範囲最小値情報を「21」とするノードN_34_1と、
ノードN_34_1の左子ノードであってユーザ特定情報を「k1」とし、範囲最小値情報を「11」とし、範囲最小値情報を「12」とするノードN_34_2と、
ノードN_34_2の右子ノードであってユーザ特定情報を「k2」とし、範囲最小値情報を「16」とし、範囲最小値情報を「18」とするノードN_34_3と、
ノードN_34_3の左子ノードであってユーザ特定情報を「k1」とし、範囲最小値情報を「14」とし、範囲最小値情報を「15」とするノードN_34_4と、
を有する。
このロック二分木15について、ロック制御部13が更新要求ユーザを「k1」、更新要求行範囲を「18、19」とする更新要求3401に基づいてノード追加処理を行う場合を述べる。ロック制御部13は、ロック二分木15をノードN_34_1から探索していき、更新要求3401の更新要求行範囲と重複するロック対象行範囲を有するノードを求める。このロック二分木15では、ノードN_34_3のロック対象行範囲が「16、18」で更新要求行範囲「18、19」と行番号「18」について重複する。ここで、ノードN_34_3のユーザ情報と更新要求3401の更新要求ユーザを比較すると、ノードN_34_3のユーザ情報「k2」であり一方更新要求ユーザ「k1」であって一致しないため、ロック制御部13は更新要求3401に基づくロックは取得不可であると判定する。行番号「18」についてユーザ「k2」がすでにロック取得済みであるためである。
[具体例2]
別の具体例として、別のロック二分木15の例について述べる。このロック二分木15は、以下のノードNによって構成されている。
ユーザ特定情報を「k1」とし、範囲最小値情報を「20」とし、範囲最小値情報を「21」とするノードN_35_1と、
ノードN_35_1の左子ノードであってユーザ特定情報を「k1」とし、範囲最小値情報を「11」とし、範囲最小値情報を「12」とするノードN_35_2と、
ノードN_35_2の右子ノードであってユーザ特定情報を「k1」とし、範囲最小値情報を「17」とし、範囲最小値情報を「18」とするノードN_35_3と、
ノードN_35_3の左子ノードであってユーザ特定情報を「k1」とし、範囲最小値情報を「14」とし、範囲最小値情報を「15」とするノードN_35_4と、
ノードN_35_3の右子ノードであってユーザ特定情報を「k2」とし、範囲最小値情報を「19」とし、範囲最小値情報を「19」とするノードN_35_5と、
である。
このロック二分木15について、更新要求ユーザを「k1」、更新要求行範囲を「18、21」とする更新要求3501に基づいてロック制御部13がノード追加処理を行う場合を述べる。上記ロック二分木に対して、更新要求3501が出された状態を図35に示す。
ロック制御部13は、ロック二分木15をノードN_35_1から探索していき、更新要求3501の更新要求行範囲と重複するロック対象行範囲を有するノードを求める。このロック二分木15では、ノードN_35_1のロック対象行範囲が「20、21」で更新要求行範囲「18、21」と行範囲「20、21」について重複する。ここでノードN_35_1のユーザ情報と更新要求3501の更新要求ユーザを比較すると、ともに「k1」で一致しているのでロック制御部13は行範囲「20、21」についてロック可能であると判定する。
ロック制御部13は、更新要求3501のうち、行範囲「20、21」を除いた残りの更新要求範囲「18、19」を有する更新要求3501_1に基づいてノード追加処理を続行する(S3312参照)。更新要求3501_1に基づいてノード追加処理を行う状態を図36に示す。
ロック制御部13は、ノードN_35_1の子ノードであるノードN_35_2から更新要求3501_1の更新要求範囲と重複しているロック対象行範囲を有するノードを求める。
ノードN_35_2のロック対象行範囲は、更新要求3501_1の更新要求範囲と重複しておらず、更新要求3501_1に対応する新たなノードをノードN_35_2の左子ノードとすることもできないため、ロック制御部13は、ノードN_35_2の右子ノードであるノードN_35_3を次の対象としてノード追加処理を続行する。
ロック制御部13は、ノードN_35_2の右子ノードであるノードN_35_3を対象として、更新要求3501_1の更新要求範囲と重複しているロック対象行範囲を有するノードを求める。ノードN_35_3のロック対象行範囲が「17、18」で更新要求行範囲「18、19」と行範囲「18」について重複する。ここでノードN_35_3のユーザ情報と更新要求3501_1の更新要求ユーザを比較すると、ともに「k1」で一致しているのでロック制御部13は行範囲「18」についてロック可能であると判定する。
ロック制御部13は、更新要求3501_1のうち、ロック可能と判定した行範囲「18」を除いた残りの更新要求範囲「19、19」を有する更新要求3501_2に基づいてノード追加処理を続行する(S3312参照)。
ロック制御部13は、ノードN_35_3の右子ノードであるノードN_35_5を対象として、更新要求3501_2の更新要求範囲と重複しているロック対象行範囲を有するノードを求める。ノードN_35_5のロック対象行範囲が「19、19」で更新要求行範囲「19、19」と行範囲「19」について重複する。ここでノードN_35_5のユーザ情報と更新要求3501_2の更新要求ユーザを比較すると、ノードN_35_5のユーザ情報「k2」であり、一方更新要求3501_2の更新要求ユーザは「k1」であって、両者は一致しないため、ロック制御部13は更新要求3501_2に基づくロックは取得不可であると判定する。行番号「19」についてユーザ「k2」がすでにロック取得済みであるためである。
すなわち、ロック制御部13は、更新要求3501について、更新対象行範囲「18、21」のすべてがロック可能で無かったため、最終的な結果としてロックは不可であると判定する。そのため、ロック取得が不可の行が存在した時点で処理を打ち切ることができる。
[具体例3]
図37に、さらに別のロック二分木15の例を示す。このロック二分木15は、以下のノードを構成要素として有している。
ユーザ特定情報を「k1」とし、範囲最小値情報を「20」とし、範囲最小値情報を「21」とするノードN_37_1と、
ノードN_37_1の左子ノードであってユーザ特定情報を「k1」とし、範囲最小値情報を「11」とし、範囲最小値情報を「12」とするノードN_37_2と、
ノードN_37_2の右子ノードであってユーザ特定情報を「k1」とし、範囲最小値情報を「17」とし、範囲最小値情報を「18」とするノードN_37_3と、
ノードN_37_3の左子ノードであってユーザ特定情報を「k1」とし、範囲最小値情報を「14」とし、範囲最小値情報を「15」とするノードN_37_4と、
である。
このロック二分木15について、更新要求ユーザを「k1」、更新要求行範囲を「16、19」とする更新要求3701に基づいてロック制御部13がノード追加処理を行う場合を述べる。ロック制御部13はロック二分木15をノードN_37_1から探索していき、更新要求3701の更新要求行範囲と重複するロック対象行範囲を有するノードを求める。このロック二分木15では、ノードN_37_3のロック対象行範囲が「17、18」であり、更新要求3701の更新要求行範囲「16、19」と行範囲「17、18」について重複する。ここでノードN_37_3のユーザ情報と更新要求3701の更新要求ユーザを比較すると、ともに「k1」で一致しているのでロック制御部13は行範囲「17、18」についてロック可能であると判定する。
次に、ロック制御部13は更新要求3701の更新要求行範囲のうち行範囲「17、18」を除いた残りの更新要求範囲「16、16」を有する更新要求3701_1と、更新要求範囲「19、19」を有する更新要求3701_2とを生成し、これらに基づいてノード追加処理を続行する。
ロック制御部13は更新要求範囲「16、16」を有する更新要求3701_1について、ノード追加処理を続行する。ロック制御部13はノードN_37_3の左子ノードであるノードN_37_4について更新要求3701_1を処理する。ノードN_37_4のロック対象行範囲「14、15」と更新要求3701_1の更新要求行範囲「16、16」は重複しておらず、ノードN_37_4の範囲最大値「15」より更新要求3701_1の範囲最小値「16」は大きく、ノードN_37_4は右子ノードを有していないので、ロック制御部13は更新要求3701_1に対応する新しいノードN_37_5を生成し、これをノードN_37_4の右子ノードとして記憶させる。ノードN_37_5が追加されたロック二分木15を図38に示す。
次にロック制御部13は更新要求範囲「19、19」を有する更新要求3701_2について、ノード追加処理を続行する。ロック制御部13はノードN_37_3について更新要求3701_1を処理する。ノードN_37_3のロック対象行範囲「17、18」と更新要求3701_2の更新要求行範囲「19」は重複しておらず、ノードN_37_3の範囲最大値「18」より更新要求3701_2の範囲最小値「19」は大きく、ノードN_37_3は右子ノードを有していないので、ロック制御部13は更新要求3701_2に対応する新しいノードN_37_6を生成し、これをノードN_37_3の右子ノードとして記憶させる。ノードN_37_6が追加されたロック二分木15を図38に示した。
このノード追加処理の結果、ロック制御部13は、ユーザk1について更新要求範囲「16、19」のロックがすべて取得可能であると判定できたので、ロック可能と判定し、判定結果をデータ制御部12に出力する。
[ノード集約処理]
ロック制御部13はノード追加処理の後に、ロック二分木中の2つのノードのロック対象行範囲が一つの連続したロック対象行範囲とできる場合に、その2つのノードを一つのノードにする処理であるノード集約処理を行う。
図39から図46に、図38に示したロック二分木について、ロック制御部13がノード集約処理を行った例を示す。
ノード集約処理において、ロック制御部13は最も下位のノードNから他のノードNと集約することができるかどうかを調べてゆく。図38に示したロック二分木15では、最下位のノードであるノードN_37_5が最初に選択される。ロック制御部13は選択したノード(「選択ノード」と呼ぶ)と他のノード(「相手ノード」と呼ぶ)と集約することが可能かどうか調べる。相手ノードは、選択ノードに近いノードから優先して選択される。図38のロック二分木15では、ノードN_37_4が相手ノードとして選択される。ノードN_37_5が選択ノードとして選択され、ノードN_37_4が相手ノードとして選択された状態を図39に示す。
ロック制御部13は、選択ノードのロック対象行範囲と、相手ノードのロック対象行範囲が一つの連続したロック対象行範囲となるか否かを調べる。これらが一つの連続したロック対象行範囲となる場合には、選択ノードを削除するともに、相手ノードのロック対象行範囲を、前記一つの連続したロック対象行範囲となるように書き換える。これらが一つの連続したロック対象行範囲とならない場合には、ロック制御部13は、ロック二分木15中の他のノードから別のノードを新たな相手ノードとして選択し、集約することが可能な相手ノードが見つかるまで全てのノードを相手ノードとして選択してゆく。
図39の例では、選択ノードであるノードN_37_5のロック対象行範囲は「16、16」であり、相手ノードであるノードN_37_4のロック対象行範囲は「14、15」である。よってこれらのロック対象行範囲は一つの連続したロック対象行範囲「14、16」とすることが可能であるので、ロック制御部13は選択ノードであるノードN_37_5を削除するとともに、相手ノードであるノードN_37_4のロック対象行範囲を「14、15」から「14、16」と変更する。ノードN_37_5を削除し、ノードN_37_4のロック対象行範囲を「14、16」と変更した状態のロック二分木15を図40に示す。
続いて、ロック制御部13は図40に示すロック二分木15について、ノード集約処理を続行する。図40に示したロック二分木15では、最下位のノードの一つであるノードN_37_4が選択ノードとして選択される。また、ロック制御部13は、相手ノードとして残りのノード中最下位のノードであるノードN_37_6を選択するが、ノードN_37_6とは一つの行範囲とならないので、次に下位のノードであるノードN_37_3を相手ノードとして選択する。ノードN_37_4が選択ノード、ノードN_37_3が相手ノードとして選択された状態を図41に示す。
図41の例では、選択ノードであるノードN_37_4のロック対象行範囲は「14、16」であり、相手ノードであるノードN_37_3のロック対象行範囲は「17、18」である。よってこれらのロック対象行範囲は一つの連続したロック対象行範囲「14、18」とすることが可能であるので、ロック制御部13は選択ノードであるノードN_37_4を削除するとともに、相手ノードであるノードN_37_3のロック対象行範囲を「14、18」と変更する。ノードN_37_4を削除し、ノードN_37_3のロック対象行範囲を「14、18」と変更した状態のロック二分木15を図42に示す。
続いて、ロック制御部13は図42に示すロック二分木15について、ノード集約処理を続行する。図42に示したロック二分木15では、最下位のノードであるノードN_37_6が選択ノードとして選択される。また、ロック制御部13は、相手ノードとして残りのノード中最下位のノードであるノードN_37_3を選択する。ノードN_37_6が選択ノード、ノードN_37_3が相手ノードとして選択された状態を図43に示す。
図43の例では、選択ノードであるノードN_37_6のロック対象行範囲は「19、19」であり、相手ノードであるノードN_37_3のロック対象行範囲は「14、18」である。よってこれらのロック対象行範囲は一つの連続したロック対象行範囲「14、19」とすることが可能であるので、ロック制御部13は選択ノードであるノードN_37_6を削除するとともに、相手ノードであるノードN_37_3のロック対象行範囲を「14、19」と変更する。ノードN_37_6を削除し、ノードN_37_3のロック対象行範囲を「14、19」と変更した状態のロック二分木15を図44に示す。
続いて、ロック制御部13は図44に示すロック二分木15について、ノード集約処理を続行する。図44に示したロック二分木15では、最下位のノードであるノードN_37_3が選択ノードとして選択される。また、ロック制御部13は、相手ノードとして、選択ノードに近いノードを優先して相手ノードとして選択し、この例ではノードN_37_2を選択するが、ノードN_37_3とは一つの行範囲とならないので、次に近いノードであるノードN_37_1を相手ノードとして選択する。ノードN_37_3が選択ノード、ノードN_37_1が相手ノードとして選択された状態を図45に示す。
図45の例では、選択ノードであるノードN_37_3のロック対象行範囲は「14、19」であり、相手ノードであるノードN_37_1のロック対象行範囲は「20、21」である。よってこれらのロック対象行範囲は一つの連続したロック対象行範囲「14、21」とすることが可能であるので、ロック制御部13は選択ノードであるノードN_37_3を削除するとともに、相手ノードであるノードN_37_1のロック対象行範囲を「20、21」から「14、21」に変更する。ノードN_37_3が削除され、ノードN_37_1のロック対象行範囲が「14、21」と変更された状態のロック二分木15を図46に示す。
続いて、ロック制御部13は図46に示すロック二分木15について、ノード集約処理を続行する。図46に示したロック二分木15では、最下位のノードであるノードN_37_2が選択ノードとして選択される。また、ロック制御部13は、相手ノードとして、選択ノードに近いノードを優先して選択するので、ノードN_37_1を選択する。ノードN_37_2とノードN_37_1それぞれのロック対象行範囲「11、12」と「14、21」とは一つの連続したロック対象行範囲とならない。また残りの他のノードも存在しないので、ロック制御部13は、ノード集約処理を終了する。すなわち、図38に示すロック二分木15は、ロック制御部13によるノード集約処理の結果、図46に示すロック二分木15に書き換えられるのである。
ノード集約処理を行うと、ノードの追加、探索などの処理量を低減させることが可能となるとともに、ロック二分木15に含まれるノード数を減少させることでロック二分木15を記憶するために必要な記憶容量を減少させることも可能となる。
[第3の実施例]
次に、本実施の形態の第3の実施例について述べる。第3の実施例は、複数のユーザによってデータベースシステムが使用されることを前提として、ユーザ全体のロック取得状況を記録するロック二分木15A(以下、「全体ロック二分木」と呼ぶ)と、個々のユーザのロック取得状況を記録するロック二分木15B(以下、「ユーザ別ロック二分木」と呼ぶ)と用いてロックの管理を行うことを特徴とする。
[データベース装置、データベース管理部等の構成]
第3の実施例にかかるマルチユーザ・データベースシステム1、データベース装置2の構成は、前述の第1の実施の形態と同じ(図1、図2参照)であるので、同一の構成要素には同一の参照番号を付して、これら構成要素の詳細な説明は省略する。
第3の実施例にかかるデータベース管理部10の構成例を図47に示す。第3の実施例にかかるデータベース管理部10は、SQL文解析部11と、データ制御部12と、ロック制御部13と、データロック情報記憶部14とを有する。
但し、第3の実施例にかかるデータベース管理部10は、全体ロック二分木15Aと、データベースを使用しているユーザそれぞれに対応する、複数のユーザ別ロック二分木15Bをデータロック情報記憶部14が有している点で、第1の実施の形態と相違している。また、第1の実施の形態ではロック二分木は全ユーザで共有する必要あるが、第3の実施の形態では全体ロック二分木は全ユーザが共有する必要あるが、ユーザ別ロック二分木は他のユーザが参照することは無いので共有する必要はない。ユーザごとに木が分かれているため、ユーザ特定情報を持つ必要が無い。集約において、ユーザ特定情報が常に一致するので、ユーザが同じかどうか判定をする必要はない。
[データベース管理システムの動作]
次に、第3の実施例にかかるデータベース管理システムの動作について説明する。図48は、第3の実施例にかかるデータベース管理部10の主たる動作の一つである、SQL文実行処理の一例を示すフローチャートである。第3の実施例にかかるSQL文実行処理は、前述の第1の実施の形態にかかるSQL文実行処理(図3参照)と基本的に同じであるので、同一の処理には同一の参照番号を付して、各処理の詳細な説明は省略する。
但し、図48に示す第3の実施例におけるステップS4Aは、全体ロック二分木15A及びユーザ別ロック二分木15Bを扱う点で、第1の実施の形態におけるステップS4と、相違している。
図49に、ステップS4Aの処理内容の例を示すフローチャートを掲げ、この図を参照しながらステップS4Aの処理内容を説明する。
ステップS4Aである該当行ロック処理において、ロック制御部13はまず、更新要求に応じた行範囲のロックが取得可能か否かについて、当該更新要求を行ったユーザに対応するユーザ別ロック二分木15Bを探索し、ロック可能な場合にはそのユーザ別ロック二分木15Bに新たなノードの追加を行う(S4901)。ノードが追加された場合には、ロック制御部13はそのノードを追加ノードリスト(図示省略)に加える。追加ノードリストは、例えば、追加されたノードごとに一つのレコードを有するデータであって、各レコードは、追加されたノードを特定する情報を格納する。
更新要求に応じたユーザ別ロック二分木15Bへのノード追加処理が完了すると、ロック制御部13は、前記追加ノードリストを参照して、新規で追加したノードが存在するか否かを判定する(S4902)。ロック制御部13は、前記追加ノードリストに、追加されたノードが記載されていれば、新規で追加したロック(ノード)が存在すると判定する。
ステップS4902において、新規で追加したノードが存在しないと判定した場合(S4902,No)、ロック制御部13はそのまま該当行ロック処理を終了する。一方、新規で追加したノードが存在すると判定した場合(S4902,Yes)、ロック制御部13は追加ノードリストから追加されたノードの情報を一つ読みだす(S4903)。
次に、ロック制御部13は全体ロック二分木15Aを探索し、ステップS4903において読みだしたノードに対応する行範囲についてロック取得可能か否かを判定する(S4905)。
ロック取得可能でないと判定した場合(S4905,No)、ロック制御部13は当該更新要求に対応するロックの取得は不可であることを示す情報をデータ制御部12に渡し(S4906)、該当行ロック処理を終了する。一方、ロック取得可能であると判定した場合(S4905,Yes)、ロック制御部13は、前記追加ノードリスト中の全てのノードについてS4905の判定を行ったか否かを判定する(S4907)。
ステップS4907において、前記追加ノードリスト中の全てのノードについてS4905の判定を行ったと判定した場合(S4907、Yes)、ロック制御部13は当該更新要求に対応するロックの取得は可能であることを示す情報をデータ制御部12に渡し(S4908)、該当行ロック処理を終了する。一方、前記追加ノードリスト中の全てのノードについてS4905の判定を行っていないと判定した場合(S4907、No)、ロック制御部13はステップS4903に戻り、追加ノードリスト中の未処理ノードについてS4903以降の処理を続行していく。
以上で該当行ロック処理の説明を終了する。
[具体例]
次に、第3の実施例にかかるデータベース管理部10の動作について、具体例をあげて説明する。ここで説明する例のロック取得状況を図50に示す。図50では、ロック取得状況をロック二分木15中のノードNの表示形式で示した。
ロック二分木15は、ノードN_50_1からノードN_50_12までの12個のノードNで構成されている。ノードN_50_1は、ユーザ特定情報として「k1」を有し、範囲最小値情報として「1」を有し、範囲最大値情報として「1」を有するノードNである。ノードN_50_2は、ユーザ特定情報として「k8」を有し、範囲最小値情報として「2」を有し、範囲最大値情報として「2」を有するノードNである。ノードN_50_3は、ユーザ特定情報として「k7」を有し、範囲最小値情報として「3」を有し、範囲最大値情報として「3」を有するノードNである。ノードN_50_4は、ユーザ特定情報として「k1」を有し、範囲最小値情報として「4」を有し、範囲最大値情報として「6」を有するノードNである。ノードN_50_5は、ユーザ特定情報として「k6」を有し、範囲最小値情報として「7」を有し、範囲最大値情報として「8」を有するノードNである。ノードN_50_6は、ユーザ特定情報として「k1」を有し、範囲最小値情報として「11」を有し、範囲最大値情報として「12」を有するノードNである。ノードN_50_7は、ユーザ特定情報として「k4」を有し、範囲最小値情報として「13」を有し、範囲最大値情報として「13」を有するノードNである。ノードN_50_8は、ユーザ特定情報として「k1」を有し、範囲最小値情報として「14」を有し、範囲最大値情報として「15」を有するノードNである。ノードN_50_9は、ユーザ特定情報として「k3」を有し、範囲最小値情報として「16」を有し、範囲最大値情報として「16」を有するノードNである。ノードN_50_10は、ユーザ特定情報として「k1」を有し、範囲最小値情報として「17」を有し、範囲最大値情報として「18」を有するノードNである。ノードN_50_11は、ユーザ特定情報として「k2」を有し、範囲最小値情報として「19」を有し、範囲最大値情報として「19」を有するノードNである。ノードN_50_12は、ユーザ特定情報として「k1」を有し、範囲最小値情報として「20」を有し、範囲最大値情報として「21」を有するノードNである。
図51に、上記ノードN_50_1からノードN_50_12をロック二分木15の表示形式で示した図を示す。
このロック二分木15において、ノードN_50_12は、左子ノードとしてノードN_50_6を有する。ノードN_50_6は、左子ノードとしてノードN_50_4を有し、右子ノードとしてノードN_50_10を有する。ノードN_50_4は、左子ノードとしてノードN_50_2を有し、右子ノードとしてノードN_50_5を有する。ノードN_50_2は、左子ノードとしてノードN_50_1を有し、右子ノードとしてノードN_50_3を有する。ノードN_50_1及びノードN_50_3はいずれの子ノードも有しない葉ノードである。ノードN_50_5もいずれの子ノードも有しない葉ノードである。
ノードN_50_10は、左子ノードとしてノードN_50_8を有し、右子ノードとしてノードN_50_11を有する。ノードN_50_8は、左子ノードとしてノードN_50_7を有し、右子ノードとしてノードN_50_9を有する。ノードN_50_7及びノードN_50_9はいずれの子ノードも有しない葉ノードである。ノードN_50_11もいずれの子ノードも有しない葉ノードである。
なお、図中に示したノードN_50_13は、ロック取得されていない行範囲を示すものであり、実際にはロック二分木15に加えられるものではなく、参考のために表示した。
次に、図50及び図51に示すロック取得状態の場合に、ユーザ別ロック二分木15B及び全体ロック二分木15Aはどのように構成されるかを説明する。図52は、ユーザ「k1」についてのユーザ別ロック二分木15Bの例を示す図である。ユーザ「k1」についてのユーザ別ロック二分木15Bは、ユーザ特定情報として「k1」を有するノードN_50_12、ノードN_50_6、ノードN_50_4、ノードN_50_10、ノードN_50_8で構成されている。一方、全体ロック二分木15Aの構成を図53に示す。全体ロック二分木15Aは、ノードN_53_1と、ノードN_53_1の左子ノードのノードN_53_2で構成される。ノードN_53_1は、ユーザ特定情報として「k0」を有し、範囲最小値情報として「11」を有し、範囲最大値情報として「21」を有するノードNである。ユーザ特定情報として「k0」を有し、範囲最小値情報として「1」を有し、範囲最大値情報として「8」を有するノードNである。なお、ユーザ特定情報「k0」は、全ユーザを示す。
第3の実施例にかかるデータロック情報記憶部14は、ユーザ別ロック二分木15Bをユーザごとに記憶している。図54に、図50及び図51に示すロック取得状態におけるデータロック情報記憶部14の記憶内容を例示する。データロック情報記憶部14は、ユーザ「k1」からユーザ「k9」のそれぞれについてユーザ別ロック二分木15Bを有し、各ユーザ別ロック二分木15Bは当該ユーザに対応するノードを含むロック二分木を記憶している。また、データロック情報記憶部14は全体ロック二分木15Aも記憶している。
第3の実施例にかかるロック制御部13は、ユーザ「k1」からの更新要求を取得した場合に、まず「k1」についてのユーザ別ロック二分木15Bを探索して、ユーザ別ロック二分木15Bに含まれない行範囲が存在するか否かを判定し、ユーザ別ロック二分木15Bに含まれない行範囲が存在する場合は、その行範囲についてロック取得可能か否かを全体ロック二分木15Aを探索して判断する。すでに全体ロック二分木15Aにその行範囲が含まれている場合は、ロック取得不可(他のユーザによりロック取得されている)とし、全体ロック二分木15Aにその行範囲が含まれていない場合は、ロック取得可能と判断するとともに、全体ロック二分木に当該行範囲に対応する新たなノードを追加する。
[動作例]
次に、第3の実施例にかかるロック制御部13の動作例について、上述の図52に示したユーザ別ロック二分木15B、及び図53に示した全体ロック二分木15Aを用いて説明する。
[ユーザk1による行範囲「14、14」とする更新要求]
図52に示したユーザ別ロック二分木15B、及び図53に示した全体ロック二分木15Aのロック取得状態で、新たにユーザk1による更新対象行範囲を「14、14」とする更新要求5501をデータベース管理部10が取得したとする。この更新要求5501を受け付けた状態を図55に示す。
更新要求5501に応じて、ロック制御部13はユーザk1のユーザ別ロック二分木15Bを探索して、更新対象行範囲「14、14」(行番号14のみを更新対象とする)が既存のノードのいずれかに含まれているか否かを調べる。この例では、ノードN_50_8が行範囲14を含んでいるので、更新要求5501についてロック取得可能(ロック取得済み)と判定する。なお、全体ロック二分木15Aについて探索は行わない。ユーザ別ロック二分木15Bで行範囲14についてロック取得済みと記録されているので、全体ロック二分木15Aにおいても、行範囲14についてロック取得されていることが反映済みとなっているからである。
[ユーザk1による更新対象行範囲「13、13」とする更新要求]
図55に示したユーザ別ロック二分木15B及び全体ロック二分木15Aのロック取得状態の後に、さらに新たな更新要求として、ユーザk1による更新対象行範囲を「13、13」とする更新要求5601をデータベース管理部10が取得したとする。この更新要求5601を受け付けた状態を図56に示す。
ロック制御部13はユーザk1のユーザ別ロック二分木15Bを探索して、更新対象行範囲「13、13」(行番号13のみ)がユーザ別ロック二分木15Bの既存のノードのいずれかに含まれているか否かを調べる。この例では、いずれのノードも行範囲「13、13」を含んでいないので、全体ロック二分木15Aに行範囲「13、13」をロック取得するためのノードN_50_14が追加可能かどうか判定する。
ロック制御部13は全体ロック二分木15Aを探索して、ノードN_50_14と同じ行範囲「13、13」についてロック取得可能か否かを判定する。この例では、行範囲「13、13」は、ロック対象行範囲「11、21」を有するノードN_53_1のロック対象行範囲に含まれているため、ロック制御部13は更新要求5601についてのロック取得は不可であると判定する。なお、この結果ユーザ別ロック二分木15BへのノードN_50_14の追加は行われない。ノードN_50_14に対応する行範囲のロック取得は不可だからである。
[ユーザk1による更新態様行範囲「3、4」とする更新要求]
図56に示したユーザ別ロック二分木15B及び全体ロック二分木15Aのロック取得状態の後に、さらに新たな更新要求として、ユーザk1による更新対象行範囲「3、4」とする更新要求5701をデータベース管理部10が取得したとする。この更新要求5701を受け付けた状態を図57に示す。
ロック制御部13はユーザk1のユーザ別ロック二分木15Bを探索して、行範囲「3、4」がユーザ別ロック二分木15Bの既存のノードのロック対象行範囲いずれかに含まれているか否かを調べる。この例では、ノードN_50_4が行番号4を含んでいるが、いずれのノードも行番号3を含んでいないので、全体ロック二分木15Aに行範囲「3、3」(行番号3のみ)についてロック取得するためのノードN_50_15が追加可能であるかどうかを判定する。
次に、ロック制御部13は全体ロック二分木15Aを探索して、ノードN_50_15と同じ行範囲「3、3」についてロック取得可能か否かを判定する。この例では、行範囲「3、3」は、行範囲「1、8」を有するノードN_53_2のロック対象行範囲に含まれているため、ロック制御部13は更新要求5701についてのロック取得は不可であると判定する。なお、ロック制御部13はユーザ別ロック二分木15BへのノードN_50_15の追加は行わない。ノードN_50_15に対応する行範囲のロック取得は他のユーザによりロック取得済みのため、ユーザk1によるロック取得は不可だからである。
[ユーザk1による行範囲9から12とする更新要求]
図57に示したユーザ別ロック二分木15B及び全体ロック二分木15Aのロック取得状態の後に、さらに新たな更新要求として、ユーザk1による行範囲「9、12」についての更新要求5801をデータベース管理部10が取得したとする。この更新要求5801を受け付けた状態を図58に示す。
ロック制御部13はユーザk1のユーザ別ロック二分木15Bを探索して、行範囲「9、12」がユーザ別ロック二分木15Bの既存のノードのロック対象行範囲のいずれかに含まれているか否かを調べる。この例では、ノードN_50_6のロック対象行範囲が行範囲「11、12」を含んでいるが、いずれのノードも行範囲「9、10」を含んでいないので全体ロック二分木15Aに行範囲「9、10」をロック取得するためのノードN_50_16を追加可能かどうか判定する。
ロック制御部13は全体ロック二分木15Aを探索して、ノードN_50_16の行範囲を含むロック対象行範囲を有するノードが存在するか否か調べる。この例では、ノードN_53_1、ノードN_53_2のいずれのロック対象行範囲も行範囲「9、10」を含んでいないので、ロック制御部13は行範囲「9、10」をロック取得するためのノードN_53_3を全体ロック二分木15Aに追加可能であると判定し、その結果、更新要求5801に対応するロック取得が可能であると判定する。また、ロック制御部13はユーザ別ロック二分木15Bに新たなノードN_50_16を追加するとともに、全体ロック二分木15Aにも新たなノードN_53_3を追加するノード追加処理を行う。
[ノード集約処理]
ロック制御部13は、図58に示すユーザ別ロック二分木15Bと全体ロック二分木15Aのそれぞれに対してノード集約処理を実行しても良い。以下に、図58に示すユーザ別ロック二分木15Bと全体ロック二分木15Aのそれぞれに対して、ロック制御部13がノード集約処理を実行した場合の例について説明する。なお、ノード集約処理の内容は、前述の第2の実施例におけるノード集約処理と同様である。
[ユーザ別ロック二分木のノード集約処理]
ロック制御部13はユーザ別ロック二分木15Bについてノード集約処理を行う。ロック制御部13は新規に登録したノードから他のノードと集約することができるかどうかを調べてゆく。図58に示したユーザ別ロック二分木15Bでは、新規に登録したノードの一つであるノードN_50_16が最初に選択ノードとして選択される。ロック制御部13は選択ノードと親ノードである相手ノードとを集約することが可能かどうか調べる。図58のロック二分木15では、ロック制御部13はノードN_50_4を相手ノードとして選択する。
ロック制御部13は、選択ノードのロック対象行範囲と、相手ノードのロック対象行範囲が一つの連続したロック対象行範囲となるか否かを調べる。これらが一つの連続したロック対象行範囲となる場合には、選択ノードを削除するともに、相手ノードのロック対象行範囲を、前記一つの連続した範囲となるように変更する。これらが一つの連続したロック対象行範囲とならない場合には、なにもしない。ロック制御部13は、ロック二分木15中のノードからその親のノードを新たな相手ノードとして選択し、親のノードが存在しなくなるまで二分木をさかのぼりを相手ノードとして選択してゆく。
図58の例では、選択ノードであるノードN_50_16のロック対象行範囲は「9、10」であり、相手ノードであるノードN_50_4のロック対象行範囲は「4、6」である。よってこれらのロック対象行範囲は一つの連続したロック対象行範囲とすることが不可能であるので、ノードN_50_4の親ノードであるノードN_50_6を新たな相手ノードとして選択する。ロック制御部13がノードN_50_16を選択ノードとし、ノードN_50_6を新たな相手ノードとした状態を図59に示す。
選択ノードであるノードN_50_16のロック対象行範囲は「9、10」であり、新たな相手ノードであるノードN_50_6のロック対象行範囲は「11、12」である。よってこれらのロック対象行範囲は一つの連続したロック対象行範囲「9、12」とすることが可能であるので、ロック制御部13は選択ノードであるノードN_50_16を削除するとともに、相手ノードであるノードN_50_6のロック対象行範囲を「11、12」から「9、12」と変更する。ロック制御部13がノードN_50_16を削除し、ノードN_50_6のロック対象行範囲を「9、12」と変更した状態のロック二分木15を図60に示す。
ロック制御部13は、残りのノードについてもノード集約処理を実行するが、いずれのノードについても集約可能な組み合わせとならないため、図60の状態で、ユーザ別ロック二分木15Bのノード集約処理は終了する。
[全体ロック二分木のノード集約処理]
次に、ロック制御部13は全体ロック二分木15Aについてノード集約処理を行う。ロック制御部13は、全体ロック二分木15A中の新規に登録したノードから他のノードと集約することができるかどうかを調べてゆく。図60に示した全体ロック二分木15Aでは、新規に登録したノードノードN_53_3が最初に選択ノードとして選択される。ロック制御部13は選択ノードと親ノードである相手ノードとを集約することが可能かどうか調べる。図60の全体ロック二分木15Aでは、ロック制御部13はまずノードN_53_2を相手ノードとして選択する。図61に、全体ロック二分木15AのノードN_53_3を選択ノードとし、ノードN_53_2を相手ノードとして選択した状態を示す。
選択ノードであるノードN_53_3のロック対象行範囲は「9、10」であり、相手ノードであるノードN_53_2のロック対象行範囲は「1、8」である。よってこれらのロック対象行範囲は一つの連続したロック対象行範囲「1、10」とすることが可能であるので、ロック制御部13は選択ノードであるノードN_53_3を削除するとともに、相手ノードであるノードN_53_2のロック対象行範囲を「1、8」から「1、10」に変更する。ロック制御部13がノードN_53_3を削除し、ノードN_53_2のロック対象行範囲を「1、10」と変更した状態のロック二分木15Aを図62に示す。
次に、ロック制御部13は全体ロック二分木15Aについてさらにノード集約処理を続行する。ロック制御部13は、図62に示した全体ロック二分木15Aでは、最下位のノードであるノードN_53_2を新たな選択ノードとして選択する。ロック制御部13は選択ノードと相手ノードとを集約することが可能かどうか調べる。相手ノードは、選択ノードに近いノードが優先して選択される。図62の全体ロック二分木15Aでは、他のノードはノードN_53_1のみであり、ノードN_53_1が相手ノードとして選択される。図63に、ロック制御部13が全体ロック二分木15AのノードN_53_2を選択ノードとし、ノードN_53_1を相手ノードとして選択した状態を示す。
選択ノードであるノードN_53_2のロック対象行範囲は「1、10」であり、相手ノードであるノードN_53_1のロック対象行範囲は「11、21」である。よってこれらのロック対象行範囲は一つの連続したロック対象行範囲「1、21」とすることが可能であるので、ロック制御部13は選択ノードであるノードN_53_2を削除するとともに、相手ノードであるノードN_53_1のロック対象行範囲を「11、21」から「1、21」に変更する。ロック制御部13がノードN_53_2を削除し、ノードN_53_1のロック対象行範囲を「1、21」と変更した状態の全体ロック二分木15Aを図64に示す。この状態では、全体ロック二分木15A中のノードはノードN_53_1の一つのみになったので、これ以上ノードの集約を行うことはできないため、ロック制御部13はノード集約処理を終了する。
[まとめ]
本実施の形態及び各実施例の利点を述べる。
1.複数の行について一つのノードでまとめてデータロックの記述できるので、ロック二分木中のノードを少なくすることが可能となる。ユーザからの「UPDATE」が空間的局所性があれば、さらに少ないノードでデータロックの記述が可能となる。本実施の形態によれば、ロック二分木へのノードの登録作業自体は高速で省メモリとなる。
2.本実施の形態及び各実施例は、ノードN(ロウロックオブジェクト4)がロック対象行範囲を扱うことにより、複数のロック対象行をまとめて登録することを可能とする。よって、個別にロック対象行をノードとしてロック二分木に登録する従来記述より高速でデータロックの登録が可能となる。これは、ロック二分木15の探索において、同じ方向なら複数のロック対象行について「相乗り」(同時に探索)できるためである。
3.また、ノード集約処理を行うことにより、上記の利点をさらに向上させることを可能としている。
以上、本発明の実施の形態、及び実施例を説明したが、本発明はこれらに限定されるものではなく、発明の趣旨を逸脱しない範囲内において、種々の変更、追加、組み合わせ等が可能である。