JP4261609B1 - トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システム - Google Patents
トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システム Download PDFInfo
- Publication number
- JP4261609B1 JP4261609B1 JP2008120540A JP2008120540A JP4261609B1 JP 4261609 B1 JP4261609 B1 JP 4261609B1 JP 2008120540 A JP2008120540 A JP 2008120540A JP 2008120540 A JP2008120540 A JP 2008120540A JP 4261609 B1 JP4261609 B1 JP 4261609B1
- Authority
- JP
- Japan
- Prior art keywords
- transaction
- processing
- transactions
- task
- block
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2308—Concurrency control
- G06F16/2336—Pessimistic concurrency control approaches, e.g. locking or multiple versions without time stamps
- G06F16/2343—Locking methods, e.g. distributed locking or locking implementation details
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2308—Concurrency control
- G06F16/2315—Optimistic concurrency control
- G06F16/2322—Optimistic concurrency control using timestamps
Abstract
数多くのトランザクションを効率よく同時に処理するために、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムを提案する。
【解決手段】
入力された複数のトランザクションを別々に処理するのではなく、入力された複数のトランザクションが処理を行うデータ項目に対して、そのデータ項目を一度だけ検索し、検索したデータ項目に対して、複数のトランザクションの更新処理を順次メインメモリ内で行い、最後に更新した結果だけをデータベースに一度だけ書き込むことを用いる。
複数の合成トランザクションの処理を同時に並行して実行するために、トランザクションの同時実行制御を備えたマルチオペレーションに、二相ロックを用いたマルチオペレーション・プロセッシングと、タイムスタンプを用いたマルチオペレーション・プロセッシングを用いている。
【選択図】図1
Description
複数のトランザクションをデータの矛盾が起こることなく処理するにあたって、最も簡単な手法は、トランザクションを1つずつ順番に処理していくことである。この手法は直列スケジュール(serial schedule)と呼び、1つのトランザクション処理が完全に終了してからでないと、次のトランザクションの処理を始めない手法である。しかし、この手法は、複数のトランザクションの処理を同時に平行して行うことができないため、1つのトランザクションがディスクへのI/O処理を完了するまで待っている間、CPU処理を他のトランザクションに切り替えることができないなど、重要なCPU処理時間を無駄にすることになる。
そのため、複数のトランザクションを、データの矛盾が起こることなく、同時に平行して実行するには、直列可能スケジュール(serializable schedule)という手法が用いられる。
ただし、ロックを用いただけでは、ロックをかける順番によっては、複数のトランザクション間でデータの矛盾が発生する場合がある。そのため、複数のトランザクションが同一のデータ項目に対してロックをかける場合、ロックをかけた順番に、それらのトランザクションに対して従属グラフを作成する手法が用いられる。従属グラフにサイクルが存在する場合は、複数のトランザクション間でデータの矛盾が発生したことになり、すべてのトランザクションの処理を中断し、中断したトランザクションの処理を再度始めから行うことになる。なお、従属グラフにサイクルが存在しない場合は、すべてのトランザクションの処理が矛盾なく実行されたことになる。
しかし、この手法だと、従属グラフにサイクルが発生する度に、トランザクションの処理が繰り返して中断されるため効率的ではない。また、何度もトランザクションの処理を繰り返しても直列可能スケジュールで行われない場合もある。そのため、直列可能スケジュールを保障するプロトコルとして、二相ロック・プロトコル、楽観的ロック・プロトコル、タイムスタンプ・プロトコル、マルチバージョン・プロトコルなどが用いられる。
二相ロック・プロトコルは、各トランザクションの中のロック操作を、ロックをかける操作だけからなる成長相(growing phase)と、ロックをはずす操作だけからなる縮退相(shrinking phase)の2つの部分に分離して行う。したがって、ロックを解除した後に、再びロックをかけることは許されない。また、成長相ではロックをかける操作以外にロックのアップグレードが許され、縮退相ではロックを解く操作以外にロックのダウングレードが許される。直列可能スケジュールを行うには、すべてのトランザクションが二相ロック・プロトコルに従う必要がある。
二相ロック・プロトコルは、同時に処理するトランザクションの数が増えると、複数のトランザクションの間でロックをかけるために競合が起こり、デッドロックが起こりやすくなる。その結果、デットロックをはずすために数多くのトランザクションが中断してロールバックすることになり、トランザクションの処理速度を低下させることになる。
二相ロック・プロトコルは、複数のトランザクションが同時に、同じデータ項目に対して処理を行う必要がある場合、個々のトランザクションごとに、そのデータ項目に対して何度も繰り返してロックをかけることになる。そして1つのトランザクションがあるデータ項目に対してロックをかけている間、そのデータ項目に対して処理を行う他のトランザクションは、そのロックが解除されるまで待たされることになる。
楽観的ロック(optimistic locking protocol)は、トランザクションを実行するのに競合がないものと仮定して処理を行い、トランザクションが終了するときに、競合があったかどうかを確認し、競合があったならば、トランザクションを中断してロールバックする。競合がなかったならば、その時点でデータを書き込むデータ項目に対してロックをかけ、書き込み処理を実行し、トランザクションをコミットする。この手法はトランザクションの処理が行われている間、ロックをかけたままの状態にしておく必要がなく、ロックをかけておく時間はトランザクションがコミットする前の短い時間だけですむ。
楽観的ロック・プロトコルも二相ロック・プロトコルと同様に、同時に処理するトランザクションの数が増えると、データを更新するために競合するトランザクションの数が増え、中断してロールバックするトランザクションの数も増えるといった問題点がある。
タイムスタンプ・プロトコルは、複数のトランザクションを同時に並行して処理するにあたって、個々のトランザクションにタイムスタンプ(到着時間)を与え、タイムスタンプの小さい(到着時間の早い)トランザクションからタイムスタンプの大きい(到着時間の遅い)トランザクションへと順番に実行していく手法である。そのためには、トランザクションが処理を行う個々のデータ項目に対して、読み込みタイムスタンプと書き込みタイムスタンプを与えて、次の規約に従ってトランザクション処理を行う。
なお、中断したトランザクションは、ロールバックし、トランザクション処理システムに再提出し、新たなタイムスタンプが与えられることになる。
タイムスタンプ・プロトコルはロックを使用しないため、デッドロックが起こることはない。しかし、同時に処理するトランザクションの数が増えると、個々のデータ項目に対して、正しい順番でトランザクションの処理が行われなくなり、数多くのトランザクションが中断してロールバックし、トランザクション処理システムに再提出されることになる。このような処理が繰り返されると、いつまでたってもトランザクションの処理が完了しなくなるといった問題が起こる。
マルチバージョンを用いた手法は、当面のトランザクションがあるデータ項目に対して、データを書き込む際に、そのデータ項目の前の値を維持し、1つのデータ項目に対して複数の値を管理する手法である。そして、複数のトランザクションが、同じデータ項目に対して処理を行う場合、個々のトランザクションに対して、適切なバージョンのデータ項目を与えることによって、中断されるトランザクションの数を減らしている。マルチバージョンを用いた手法は、二相ロック・プロトコルにマルチバージョンを適用させた手法と、タイムスタンプ・プロトコルにマルチバージョンを適用させた手法などがある。
マルチバージョンの問題点は、個々のデータ項目に対して複数のバージョンを維持するために余分な記憶スペースが必要になることである。
さらに、データベースのトランザクション処理システムの各機能を、コンピュータ・システムに実現させるためのプログラムや、このプログラムを記録した記録媒体も本発明である。
本発明のシステムでは、複数のトランザクションが処理を行うデータ項目に対して、そのデータ項目を一度だけ検索し、検索したデータ項目に対して、複数のトランザクションの更新処理を順次メインメモリ内で行い、最後に更新した結果だけをデータベースに一度だけ書き込めばよいのでトランザクションの処理速度が向上した。
また、マルチオペレーション・プロセッシングを用いるので、トランザクションの処理を行う個々のデータ項目が格納してあるブロックをディスクから一度だけしか読み出す必要がなくなった。
本発明のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングが上記のクエリーの処理だけを扱ったマルチオペレーション・プロセッシングと異なる点は、検索処理しか行わないトランザクション(クエリー)の処理以外に、更新処理を行うトランザクションの処理を行うことができるようになったことである。
図1は、本発明のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムのアーキテクチャを示す図である。このアーキテクチャは、マイクロプロセッサ(CPU)、主記憶装置(メインメモリ)、2次記憶装置(ディスク)を備えたコンピュータ・システム105において、トランザクション処理システム100、キュー103、マルチオペレーション・プロセッサ102などのソフトウェアのモジュールから構成されている。
図2−1,図2−2は、図1で説明したトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムにおいて、トランザクションを処理する一連の流れの概略を説明するためのフローチャートである。
トランザクション処理システム100は、入力されたトランザクションに対して、実行可能なオペレーションに変換してトランザクションの部分処理を作成する(S201)。トランザクションの部分処理を作成すると、トランザクションの実行順を決定する(S202)。
先行グラフを作成すると、トランザクションに含まれる部分処理をタスクとして取り出し、取り出したタスクをデータベースのリレーション(アクセス領域)ごとにグループ分けして、グループG1,G2,…,Gnを作成する(S204)。
作成されたグループG1,G2,…,Gnを用いて合成トランザクションTG1,G2,…,Gnを作成する(S205)。
マルチオペレーション・プロセッッサ102は、グループ内のタスクがアクセスするブロックを調べてブロック集合に集める(S207)。
ブロック集合にブロックを集めると、グループ内のタスクが並んだ順にブロックへのアクセス順を決定する(S208)。
決定したブロックのアクセス順にブロックを読み出し、読み出したブロックにアクセスするタスクをグループから抽出し、ブロック内のデータ項目に対して、グループ内のタスクが並んだ順にタスク処理を順次行っていく(S209)。
ブロックでタスクの処理が終了すると(図2−2:S210)、終了したタスクを包含するトランザクションの処理が終了したかどうかを調べる(S211)。トランザクションの処理が終了したかどうかは、トランザクションに含まれるすべてのタスクの処理が終了したかどうかで調べることになる。トランザクションの処理が終了しない場合は、ブロックのアクセス順に示したすべてのブロックをアクセスしたがどうかを確認する(S217)。
終了したトランザクションの接点に入力枝が存在し、この時点でトランザクションをコミットできない場合は、そのトランザクションをコミット待ちのトランザクションとして置いておく(S216)。
アクセスしたブロックでの処理が終了すると、ブロックのアクセス順に示したすべてのブロックをアクセスし終えたかどうかを確認する(S217)。
まだ、アクセスしてないブロックが残っているならば、ブロックのアクセス順に、次にアクセスするブロックをディスクから読み出し、読み出したブロックにアクセスするタスクをグループから抽出し、読み出したブロック内のデータ項目に対して、トランザクションの実行順にトランザクションの部分処理であるタスク処理を繰り返して行っていく(S209)。
まだ、グループが残っている場合は、次に処理するグループを合成トランザクションから取り出し、取り出したグループに対して、マルチオペレーション・プロセッシングを用いて処理を行い、このようにしてグループの処理を繰り返して行っていく(S206)。
合成トランザクションに含まれるすべてのグループ処理を終えると、合成トランザクションの処理が完了し、入力されたすべてのトランザクションT1,T2,T3,…,Tsの処理が終了してコミットしたことになる(S220)。
以下の章において、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムについて詳しく説明していくことにする。
第1章では、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたトランザクション処理の手順、及び具体例を示している。第2章では、複数の合成トランザクションを同時に並行して実行するために、二相ロックを用いたマルチオペレーション・プロセッシングとタイムスタンプを用いたマルチオペレーション・プロセッシングを提案し、それぞれの手法を用いた複数の合成トランザクションの処理を並行して行うための手順、及び具体例を示している。第3章では、結合演算の処理を行うクエリーなど、複雑で高度なクエリーがトランザクションに含まれている場合のマルチオペレーション・プロセッシングを具体例をもとに説明している。
第4章では、従来のトランザクションの処理である二相ロック・プロトコルと、本発明のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングとの処理速度を比較するために、独自に開発したデータベース・マネージメント・システムのソフトウェアMOP-DBを用いて、それぞれの処理を用いた実験結果を示している。
[1.1トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングの手順]
[(1) トランザクションの部分処理の作成(S201)]
データベース・マネージメント・システムに、複数のトランザクションT1,T2,T3,…,Tsが入力される(S200)と、個々のトランザクションに対して、トランザクションが行うレコードrの読み取り処理をread_item(r)とし、レコードrの書き込み処理をwrite_item(r)として表わしたトランザクションの部分処理を作成する(S201)。
トランザクションの部分処理を求めると、入力された複数のトランザクションT1,T2,T3,…,Tsに対して、トランザクションの実行順を決定する(S202)。トランザクションの実行順を決定するには、トランザクションの部分処理をもとにしてトランザクションの処理コストを求め、処理コストの小さいトランザクションから処理コストの大きいトランザクションへとトランザクションを並べてトランザクションの実行順を決定する。
なお、トランザクションの処理コストよりも、トランザクションの到着時間の方が重要である場合は、トランザクションの到着順をトランザクションの実行順にしてもよい。
トランザクションの実行順を決定すると、トランザクションT1,T2,T3,…,Tsを接点とした先行グラフを作成する(S203)。先行グラフを作成するにあたって、トランザクションT1,T2,T3,…,Tsの中で、複数のトランザクションが同一のデータ項目に対して処理を行う場合、そのデータ項目に対して矢印を持った枝を作成し、トランザクションの実行順に、先に処理を行うトランザクションの接点から、次に処理を行うトランザクションの接点へと、その枝を入力する。
トランザクションの実行順が、トランザクションの処理コストの小さい順で並べられている場合は、処理コストの小さいトランザクションの接点から処理コストの大きいトランザクションの接点へと、枝を入力することになる。また、トランザクションの実行順が、トランザクションの到着順で並べられている場合は、先に到着したトランザクションの接点から次に到着したトランザクションの接点へと枝を入力することになる。
トランザクションT1,T2,T3,…,Tsに含まれる個々の更新処理、及び検索処理などの部分処理をタスクti j(i=トランザクションの番号、j=トランザクション内の処理番号)として取り出し、取り出したタスクを、トランザクションの実行順にデータベースのリレーション(アクセス領域)ごとにグループG1,G2,…,Gnとしてグループに分けていく(S204)。リレーションはデータベースのアクセス領域である。
タスクがリレーションごとにグループ分けされると、作成されたグループG1,G2,…Gnを用いて合成トランザクショTG1,G2,…Gnを作成する(S205)。合成トランザクションTG1,G2,…Gnの処理を行うには、マルチオペレーション・プロセッシングを用いて合成トランザクションTG1,G2,…Gnに含まれる個々のグループ処理を順次行っていくことになる。
最初に、合成トランザクションTG1,G2,…GnからグループG1を取り出し、マルチオペレーション・プロセッシングを用いてグループG1の処理を開始する(S206)。
グループG1内のタスクt1, t2, t3,…,tpがアクセスするリレーションに存在するインデックスを用いて、グループG1内のタスクt1, t2, t3,…,tpが、リレーション内のブロックb1,b2,b3,…bmのうちアクセスする必要のあるブロック(ブロックの格納位置)を調べて、アクセスする必要のあるブロックを集めた集合を見出し、それらの集合をそれぞれブロック集合B1,B2,B3,…Bpとする(S207)。言い換えると、タスクti(i=1,2,3,…p) に対して、それに対応するブロック集合として、Bi={ブロックb1,b2,b3,…,bmの中でタスクtiがアクセスする必要があるブロック集合}{i=1,2,3,…,p}となるブロック集合を見出す。ここでブロック集合を見出すにあたっては、インデックスによるブロックの格納位置を調べるだけであって、リレーション内のブロックをディスクにアクセスしてブロックの格納位置を調べることではない。
グループG1内のタスクt1, t2, t3,…,tpに対応するブロック集合B1,B2,B3,…Bpを見出すと、ブロック集合B1,B2,B3,…,Bpの和集合を求めていく。最初に、タスクt1とタスクt2に対応するブロック集合との和集合を求め、その和集合とタスクt3に対応するブロック集合との和集合を求めるということを順次行い、最後にタスクtpに対応するブロック集合との和集合を求める。この際、順次和集合に加わるブロックは和集合中のブロックの後に加えるものとする。最後に求めた和集合の結果から、トランザクションの実行順に、トランザクションの部分処理であるタスク処理を行っていくにあたって、最初にリレーション内のどのブロックからアクセスを始めて、最後にどのブロックでアクセスを終えるかのブロックのアクセス順位を決定することができる(S208)。また、このようにして和集合を求めることは、グループ内のタスクを処理するにあたって、リレーション内のブロックを何度もディスクにアクセスして読み出すことなしに、一度だけブロックにアクセスすれば済むようにするためである。
[ブロック bjでのタスク処理]
決定されたブロックのアクセス順位に従って、リレーションにアクセスする最初のブロックをbj(1≦j≦m)としたときに、グループG1内のタスクt1,t2,t3,…,tpをこのブロックで処理を行う必要があるかどうかを調べるためにブロックbjを集合{bj}として表わし、この{bj}とタスクt1,t2,t3,…,tpに対応するブロック集合B1,B2,B3,…,Bpとの間で積集合(∩)を求める。その積集合が{bj}となったブロック集合に対応するタスクはすべてブロックbjで処理を行うことになり、積集合が空集合({})となったブロック集合に対応するタスクはブロックbjで処理を行わないことになる。なお、複数のタスクがブロックbj内の同一のデータ項目に対して処理を行う場合は、先行グラフに示したトランザクションの実行順に、それらのトランザクションの部分処理であるタスク処理を順次行っていく。
ブロックbjで処理を行う必要のあるグループG1のすべてのタスクの処理が終了すると、このブロックbjを再びアクセスする必要がなくなるので、積集合{bj}となったブロック集合と集合{bj}との差集合を求めて、差集合によって得られたブロック集合をBi (1)(i=1,2,…,p)としたときに、その差集合Bi (1)が空集合({})となったブロック集合に対応するタスクは処理が終了(S210)したことになり、その差集合が空集合でないブロック集合に対応するタスクはまだ処理が終了していないことになる。
ブロックbjでのタスクの処理が終了すると、終了したタスクを包含するトランザクションの処理が終了したかどうかを確認する(S211)。トランザクションに含まれるすべてのタスクの処理が終了する(S211:YES)と、トランザクションの処理が終了することになる。トランザクションの処理が終了すると、この時点で終了したトランザクションをコミットすることができるかどうかを、先行グラフをもとにして決定する(S212)。
終了したトランザクションの接点に入力している枝が存在する場合(S212:NO)は、そのトランザクションをコミットしないで、コミット待ちのトランザクションとして置いておく(S216)。終了したトランザクションの接点に入力している枝が1つも存在しない場合(S212:YES)は、そのトランザクションをコミットする(S213)。トランザクションをコミットすると、先行グラフからそのトランザクションの接点と、その接点から出ているすべての枝を削除する(S214)。
さて、すべてのブロックをアクセスしていない場合(S217:NO)、S209に戻り、ブロックのアクセス順位に従って、次のブロックbk(1≦k≦m)を読み出し、ブロックbkを集合{bk}として表わし、この集合{bk}と、すでに処理が終了したタスク以外のグループ内にタスクに対応するブロック集合の間で積集合を求める。その積集合が{bk}となったブロック集合に対応するタスクはすべてブロックbkで処理を行うことになる。ブロックbkで処理を行う必要のあるグループG1内のすべてのタスクの処理が終了すると、ブロックbkを再びアクセスすることがなくなるので、積集合が{bk}となったブロック集合Bi (1)(ブロックbjで処理終了後に差集合によって得られたブロック集合)と集合{bk}との差集合を求める。この差集合が空集合({})となったブロック集合に対応するタスクは処理が終了したことになり、差集合が空集合ではないブロック集合に対応するタスクは、まだ処理が完全に終了していないことになる。ここで、差集合によって得られたブロック集合をBi (2)(i=1,2,…,n)とする。
ブロックbkにおいて、タスクの処理が終了する(S210)と、そのタスクを包含するトランザクションの処理が終了したかどうかを確認する(S211)。トランザクションに含まれるすべてのタスクの処理が終了すると、トランザクションの処理が終了したことになる。トランザクションの処理が終了すると、先行グラフをもとにして、終了したトランザクションをこの時点でコミットすることができるかどうかを決定する(S212)。
終了したトランザクションの接点に入力している枝が存在する場合(S212:NO)は、そのトランザクションをコミットしないでコミット待ちのトランザクションとして置いておく(S216)。終了したトランザクションの接点に入力している枝が1つも存在しない場合(S212:YES)は、トランザクションをコミットする(S213)。トランザクションをコミットすると、そのトランザクションの接点と、その接点から出ているすべての枝を先行グラフから削除する。
グループG1の処理が終了する(S218)と、合成トランザクションTG1,G2,…,GnからグループG2,…,グループGnを順次取り出し、グループG1と同じ手順を用いてグループ処理を繰り返して行っていく(S219:NO)。
すべてのグループ処理を終える(S219:YES)と、合成トランザクションTG1,G2,…,Gnの処理が完了し、入力されたすべてのトランザクションT1,T2,T3,…,Tsの処理が終了してコミットしたことになる(S220)。
1.1章で示したトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングの手順を具体的な例を用いて詳細に説明する。図3−1は、固定長レコード(fixed length record)を使用して作成したデータベースのリレーションDEPARTMENT(300)である。リレーションDEPARTMENT(300)には25件のレコードが5つのブロックに格納してあり、各ブロックに5つのレコードが存在する。各レコードには、DNUMBER(部門番号),DNAME(部門名),MGRSSN(部門長従業員番号),BUDGET(予算), DPHONE(部門電話番号)のデータが格納されている。各ブロックは、次のブロックに対してブロックポインタを持っている。主キーDNUMBERには、主インデックス(310)が存在し、主インデックス(310)は、各ブロックに対してインデックスのポインタを持っている。また属性DPHONEには2次インデックス(321,322)が存在し、2次インデックス(321,322)は、各レコードに対してインデックスのポインタを持っている。
リレーションDEPARTMENT(300), EMPLOYEE(400), PROJECTは、リレーショナル・データベース・システムのアクセス領域であり、リレーション内のブロックはデータベースのデータが格納してあるディスク上のアクセス単位である。
-- T1の更新処理1
UPDATE DEPARTMENT
SET BUDGET = BUDGET + 10000
WHERE DNUMBER = 7;
-- T1の更新処理2
UPDATE DEPARTMENT
SET BUDGET = BUDGET + 20000
WHERE DNUMBER = 9;
-- T1の更新処理3
UPDATE EMPLOYEE
SET DNUM = 4
WHERE SSN = 2411111133;
COMMIT WORK;
-- T2の更新処理1
UPDATE DEPARTMENT
SET BUDGET = BUDGET + 22000
WHERE DPHONE = 23-3728;
-- T2の更新処理2
UPDATE DEPARTMENT
SET BUDGET = BUDGET + 30000
WHERE DNUMBER > 6 AND DNUMBER < 9;
COMMIT WORK;
-- T3の更新処理1
UPDATE DEPARTMENT
SET MGRSSN = 470124116
WHERE DNUMBER = 6 OR DNUMBER = 19;
-- T3の検索処理2
SELECT DNUMBER, DNAME
FROM DEPARTMENT
WHERE DNUMBER = 19;
COMMIT WORK;
-- T4の更新処理1
DATE DEPARTMENT
SET DPHONE = 23-3736
WHERE DNUMBER = 3;
-- T4の更新処理2
UPDATE DEPARTMENT
SET DPHONE = 23-3737
WHERE DNUMBER = 19;
-- T4の更新処理3
UPDATE EMPLOYEE
SET BDATE = 'DEC-27-1971'
WHERE SSN = 2066567788;
COMMIT WORK;
-- T5の更新処理1
UPDATE DEPARTMENT
SET BUDGET = BUDGET - 24000
WHERE DNUMBER = 7 OR DNUMBER = 8;
-- T5の更新処理2
UPDATE DEPARTMENT
SET BUDGET = BUDGET - 11000
WHERE DNUMBER = 14;
COMMIT WORK;
-- T6の更新処理1
UPDATE DEPARTMENT
SET BUDGET = BUDGET 15000
WHERE DNUMBER = 3 OR DNUMBER = 14;
-- T6の更新処理2
UPDATE DEPARTMENT
SET MGRSSN = 433424659
WHERE DNUMBER = 22;
-- T6の検索処理3
SELECT *
FROM DEPARTMENT
WHERE DNUMBER = 23;
COMMIT WORK;
-- T7の更新処理1
UPDATE EMPLOYEE
SET BDATE = 'DEC-27-1971'
WHERE SSN = 1645455566;
COMMIT WORK;
-- T8の更新処理1
UPDATE EMPLOYEE
SET DNUM = 7
WHERE PHONE = 21-3728 OR SSN = 2066567788;
COMMIT WORK;
入力されたトランザクションT1, T2, T3, T4, T5, T6, T7, T8に対して、個々のトランザクションが行うレコードrの読み取り処理をread_item(r)として表わし、レコードrの書き込み処理をwrite_item(r)として表わし、個々のトランザクションの部分処理を作成すると次のようになる。リレーションDEPARTMENT内のレコードは、D.ri(i=1,2,3,…,25)で表わし、リレーションEMPLOYEE内のレコードは、E.ri(i=1,2,3,…,20)で表わし、個々のレコードの格納位置は、リレーションに存在するインデックスを用いて調べることにする。
各トランザクションに含まれる個々の更新処理、及び検索処理などの部分処理は、タスクti j(i=トランザクションの番号、j=トランザクション内の処理番号)として表わすことにする。
(t1 1):read_item(D.r7);
D.r7.BUDGET := D.r7.BUDGET + 10000;
write_item(D.r7);
(t1 2):read_item(D.r9);
D.r9.BUDGET := D.r9.BUDGET + 20000;
write_item(D.r9);
(t1 3):read_item(E.r14);
E.r14.DNUM := 4;
write_item(E.r14);
(t2 1):read_item(D.r7);
D.r7.BUDGET := D.r7.BUDGET + 22000;
write_item(D.r7);
(t2 2):read_item(D.r7);
D.r7.BUDGET := D.r7.BUDGET + 30000;
write_item(D.r7);
read_item(D.r8);
D.r8.BUDGET := D.r8.BUDGET + 30000;
write_item(D.r8);
(t3 1):read_item(D.r6);
D.r6.MGRSSN := 470124116;
write_item(D.r6);
read_item(D.r19);
D.r19.MGRSSN := 470124116;
write_item(D.r19);
(t3 2):read_item(D.r19);
(t4 1):read_item(D.r3);
D.r3.DPHONE := 23-3736;
write_item(D.r3);
(t4 2):read_item(D.r19);
D.r19.DPHONE := 23-3737;
write_item(D.r19);
(t4 3):read_item(E.r10);
E.r10.BDATE := 'DEC-27-1971';
write_item(E.r10);
(t5 1):read_item(D.r7);
D.r7.BUDGET := D.r7.BUDGET 24000;
write_item(D.r7);
read_item(D.r8);
D.r8.BUDGET := D.r8.BUDGET 24000;
write_item(D.r8);
(t5 2):read_item(D.r14);
D.r14.BUDGET := D.r14.BUDGET 11000;
write_item(D.r14);
(t6 1):read_item(D.r3);
D.r3.BUDGET := D.r3.BUDGET 15000;
write_item(D.r3);
read_item(D.r14);
D.r14.BUDGET := D.r14.BUDGET 15000;
write_item(D.r14);
(t6 2):read_item(D.r22);
D.r22.MGRSSN := 433424659;
write_item(D.r22);
(t6 3):read_item(D.r23);
(t7 1):read_item(E.r6);
E.r6.BDATE := 'DEC-27-1971';
write_item(E.r6);
(t8 1):read_item(E.r6);
E.r6.DNUM := 7;
write_item(E.r6);
read_item(E.r10);
E.r10.DNUM := 7;
write_item(E.r10);
トランザクションの部分処理を求めると、トランザクションT1, T2, T3, T4, T5, T6, T7, T8に対して、トランザクションの実行順を決定することになる。
トランザクションの実行順を決定するには、トランザクションに含まれる部分処理をもとにしてトランザクションの処理コストを求め、トランザクションの処理コストの小さい順にトランザクションを並べてトランザクションの実行順を決定するとよい。そのため、トランザクションの部分処理をもとにしてトランザクションの処理コストをもとめると次のようになる。
トランザクションの処理コストを求めると、次のようにして処理コストの小さい順にトランザクションを並べてトランザクションの実行順をT2, T7, T3, T1, T5, T8, T4, T6と決定することができる。ここで、sortは処理コストの小さい順に並べ換えることを表わしている。
sort(T1, T2, T3, T4, T5, T6, T7, T8)⇒ (T2, T7, T1, T3, T5, T8, T4, T6)
トランザクションの実行順を決定すると、トランザクションT2, T7, T1, T3, T5, T8, T4, T6を接点とした図4(a)に示す先行グラフを作成する。先行グラフを作成するにあたって、トランザクションT2, T7, T3, T1, T5, T8, T4, T6の中で複数のトランザクションが同一のデータ項目に対して処理を行う場合、そのデータ項目に対して矢印を持った枝を作成し、トランザクションの実行順に先に処理を行うトランザクションの接点から次に処理を行うトランザクションの接点へとその枝を入力させて、同一のデータ項目に対するトランザクションの実行順を示しておく。なお、1つのトランザクションだけで処理されるデータ項目は先行グラフに枝を記入しないことにする。
トランザクションT2,T1,T5は、リレーションDEPARTMENT内の同一のレコードD.r7に対して更新処理を行うため、トランザクションの実行順に、接点T2から接点T1へと枝を入力させ、接点T1から接点T5へと枝を入力させる。
トランザクションT2,T5は、リレーションDEPARTMENT内の同一のレコードD.r8に対して更新処理を行うため、トランザクションの実行順に、接点T2から接点T5へと枝を入力させる。
トランザクションT5,T6は、リレーションDEPARTMENT内の同一のレコードD.r14に対して更新処理を行うため、トランザクションの実行順に、接点T5から接点T6へと枝を入力させる。
トランザクションT7,T8は、リレーションEMPLOYEE内の同一のレコードE.r6に対して更新処理を行うため、トランザクションの実行順に、接点T7から接点T8へと枝を入力させる。
トランザクションT8,T4は、リレーションEMPLOYEE内の同一のレコードE.r10に対して更新処理を行うため、トランザクションの実行順に、接点T8から接点T4へと枝を入力させる。
なお、図4(a)に示す先行グラフは、トランザクションの実行順にもとづいて作成されるため、サイクルを含んでおらず、この先行グラフをもとにして行われるトランザクションのスケジュールは、直列可能スケジュールである。
トランザクションT2, T7, T1, T3, T5, T8, T4, T6から、トランザクションの部分処理であるタスクt2 1,t2 2,t7 1,t1 1,t1 2,t1 3,t3 1,t3 2,t5 1,t5 2,t8 1,t4 1,t4 2,t4 3,t6 1,t6 2,t6 3を取り出し、取り出したタスクをデータベースのリレーションをもとにしてグループに分け、グループ分けされたタスクをトランザクションの実行順に並べると次のようになる。
DEPARTMENT: グループ G1 = {t2 1, t2 2, t1 1, t1 2, t3 1, t3 2, t5 1, t5 2, t4 1, t4 2, t6 1, t6 2, t6 3}
EMPLOYEE: グループ G2 = {t7 1, t1 3, t8 1, t4 3}
グループG1にはリレーションDEPARTMENTに対して処理を行うタスクを集め、グループG2にはリレーションEMPLOYEEに対して処理を行うタスクを集めることになる。
タスクをグループ分けして、グループG1,G2を作成すると、グループG1,G2を用いて合成トランザクションTG1,G2を作成する。合成トランザクションTG1,G2の処理を行うには、合成トランザクションTG1,G2に含まれるグループG1, G2に対して、それぞれマルチオペレーション・プロセッシングを用いて処理することになる。
[(a) タスクがアクセスするブロックの集合(S207)]
図3のリレーションDEPARTMENT(300)の主インデックス(310)及び二次インデックス(321,322)を用いて、グループG1内のタスクt2 1, t2 2, t1 1, t1 2, t3 1, t3 2, t5 1, t5 2, t4 1, t4 2, t6 1, t6 2, t6 3を処理するために読み出す必要のあるリレーションDEPARTMENT(300)内のブロックを調べて、個々のタスクに対応するブロック集合B2 1, B2 2, B1 1, B1 2, B3 1, B3 2, B5 1, B5 2, B4 1, B4 2, B6 1, B6 2, B6 3に集めると次のようになる。ここでブロック集合を見出すにあたっては、インデックスによるブロックの格納位置を調べるだけであって、リレーション内のブロックをディスクにアクセスしてブロックの格納位置を調べることではない。
タスクt2 2に対して、B2 2 = {b2}
タスクt1 1に対して、B1 1 = {b2}
タスクt1 2に対して、B1 2 = {b2}
タスクt3 1に対して、B3 1 = {b2,b4}
タスクt3 2に対して、B3 2 = {b4}
タスクt5 1に対して、B5 1 = {b2}
タスクt5 2に対して、B5 2 = {b3}
タスクt4 1に対して、B4 1 = {b1}
タスクt4 2に対して、B4 2 = {b4}
タスクt6 1に対して、B6 1 = {b1,b3}
タスクt6 2に対して、B6 2 = {b5}
タスクt6 3に対して、B6 3 = {b5}
グループ内の個々のタスクに対応するブロック集合を見出すと、グループにタスクが並べられた順に、すなわちt2 1, t2 2, t1 1, t1 2, t3 1, t3 2, t5 1, t5 2, t4 1, t4 2, t6 1, t6 2, t6 3の順に、各タスクに対応するブロック集合の和集合を求めていく。最初に、TB0={}(空集合)を用意し、TB0とタスクt2 1に対応するブロック集合B2 1との和集合TB2 1を求める。次に、このTB2 1とタスクt2 2に対応するブロック集合B2 2との和集合TB2 2を求める。同様にして、タスクt1 1, t1 2, t3 1, t3 2, t5 1, t5 2, t4 1, t4 2, t6 1, t6 2, t6 3に対応するブロック集合B1 1, B1 2, B3 1, B3 2, B5 1, B5 2, B4 1, B4 2, B6 1, B6 2, B6 3に対しても和集合TB1 1, TB1 2, TB3 1, TB3 2, TB5 1, TB5 2, TB4 1, TB4 2, TB6 1, TB6 2, TB6 3を順次求めると次のようになる。この場合、順次和集合に加わるブロックは和集合中のブロックの後に加えていくものとする。
ブロック集合B2 1との和集合: TB2 1 ← TB0 U B2 1, TB2 1 = {b2}
ブロック集合B2 2との和集合: TB2 2 ← TB2 1 U B2 2, TB2 2 = {b2}
ブロック集合B1 1との和集合: TB1 1 ← TB2 2 U B1 1, TB1 1 = {b2}
ブロック集合B1 2との和集合: TB1 2 ← TB1 1 U B1 2, TB1 2 = {b2}
ブロック集合B3 1との和集合: TB3 1 ← TB1 2 U B3 1, TB3 1 = {b2, b4}
ブロック集合B3 2との和集合: TB3 2 ← TB3 1 U B3 2, TB3 2 = {b2, b4}
ブロック集合B5 1との和集合: TB5 1 ← TB3 2 U B5 1, TB5 1 = {b2, b4}
ブロック集合B5 2との和集合: TB5 2 ← TB5 1 U B5 2, TB5 2 = {b2, b4, b3}
ブロック集合B4 1との和集合: TB4 1 ← TB5 2 U B4 1, TB4 1 = {b2, b4, b3, b1}
ブロック集合B4 2との和集合: TB4 2 ← TB4 1 U B4 2, TB4 2 = {b2, b4, b3, b1}
ブロック集合B6 1との和集合: TB6 1 ← TB4 2 U B6 1, TB6 1 = {b2, b4, b3, b1}
ブロック集合B6 2との和集合: TB6 2 ← TB6 1 U B6 2, TB6 2 = {b2, b4, b3, b1, b5}
ブロック集合B6 3との和集合: TB6 3 ← TB6 2 U B6 3, TB6 3 = {b2, b4, b3, b1, b5}
[(c-1) ブロックb2にアクセス]
最初に、リレーションDEAPARTMENT内のブロックの格納位置が256であるブロックb2内のデータをディスクからメインメモリに読み込み、グループG1内のタスクt2 1, t2 2, t1 1, t1 2, t3 1, t3 2, t5 1, t5 2, t4 1, t4 2, t6 1, t6 2, t6 3がブロックb2で処理を行う必要があるかどうかを調べるため、ブロックb2を集合{b2}として表し、{b2}とブロック集合B2 1,B2 2, B1 1, B1 2, B3 1, B3 2, B5 1, B5 2, B4 1, B4 2, B6 1, B6 2, B6 3との間でそれぞれ積集合(∩) を求めると次のようになる。
タスクt2 2に対して: B2 2 ∩ {b2} = {b2}
タスクt1 1に対して: B1 1 ∩ {b2} = {b2}
タスクt1 2に対して: B1 2 ∩ {b2} = {b2}
タスクt3 1に対して: B3 1 ∩ {b2} = {b2}
タスクt3 2に対して: B3 2 ∩ {b2} = {}
タスクt5 1に対して: B5 1 ∩ {b2} = {b2}
タスクt5 2に対して: B5 2 ∩ {b2} = {}
タスクt4 1に対して: B4 1 ∩ {b2} = {}
タスクt4 2に対して: B4 2 ∩ {b2} = {}
タスクt6 1に対して: B6 1 ∩ {b2} = {}
タスクt6 2に対して: B6 2 ∩ {b2} = {}
タスクt6 3に対して: B6 3 ∩ {b2} = {}
タスクt2 1, t2 2, t1 1, t1 2, t3 1, t5 1の処理を行うにあたっては、ブロック内のレコード順位が小さいレコードから順番に処理していき、個々のレコードに対しては、タスクt2 1, t2 2, t1 1, t1 2, t3 1, t5 1の順番でタスク処理を行っていくことになり、それらの処理は次のような順番になる。
レコードD.r7に関しては、図4(a)に示す先行グラフに示すトランザクションのT2,T1,T5の実行順に、それらのトランザクションの部分処理であるタスクt2 1, t2 2, t1 1, t5 1の更新処理を順次行っていく。タスクt2 1は、データベースから読み込んだレコードD.r7に対して更新処理を行う。タスクt2 2は、タスクt2 1が更新したレコードD.r7に対して更新処理を行う。タスクt1 1は、タスクt2 2が更新したレコードD.r7に対して更新処理を行う。タスクt5 1は、タスクt1 1が更新したレコードD.r7に対して更新処理を行う。このようにタスクt2 1,t2 2,t1 1,t5 1による更新処理をメインメモリ内で順次行い、タスクt5 1による最後の更新結果のみをデータベースに一度だけ書き込むことになる。
レコードD.r8に関しては、先行グラフ400に示すトランザクションのT2,T5の実行順に、それらのトランザクションの部分処理であるタスクt2 2, t5 1の更新処理を順次行っていく。タスクt2 2は、データベースから読み込んだレコードD.r8に対して更新処理を行う。タスクt5 1は、タスクt2 2が更新したレコードD.r8に対して更新処理を行う。タスクt2 2, t5 1による更新処理はメインメモリ内で順次行い、タスクt5 1による最後の更新結果のみをデータベースに一度だけ書き込むことになる。
ブロックb2でのタスクt2 1, t2 2, t1 1, t1 2, t3 1, t5 1の処理が終了すると、ブロックb2を再びアクセスする必要がなくなるので、ブロック集合B2 1, B2 2, B1 1, B1 2, B3 1, B5 1と集合{b2}との差集合を求めて、得られた差集合をB2 1(1), B2 2(1), B1 1(1), B1 2(1), B3 1(1), B5 1(1)とすると、次のようになる。
タスクt2 1に対して: B2 1(1) ← B2 1 - {b2}, B2 1(1) = {}
タスクt2 2に対して: B2 2(1) ← B2 2 - {b2}, B2 2(1) = {}
タスクt1 1に対して: B1 1(1) ← B1 1 - {b2}, B1 1(1) = {}
タスクt1 2に対して: B1 2(1) ← B1 2 - {b2}, B1 2(1) = {}
タスクt3 1に対して: B3 1(1) ← B3 1 - {b2}, B3 1(1) = {b4}
タスクt5 1に対して: B5 1(1) ← B5 1 - {b2}, B5 1(1) = {}
また、トランザクションT1,T5によるレコードD.r7に対する更新処理は終了したけれども、T1,T5はまだコミットしていないため、図4(b)の先行グラフ内の接点T1から接点T5へと入力しているD.r7の枝を点線の枝として残しておくことにする。
次に、リレーションDEPARTMENT内のブロックの格納位置が768であるブロックb4内のデータをディスクからメインメモリに読み込み、すでに処理が終了したタスクt2 1, t2 2, t1 1, t1 2, t5 1以外のグループ内のタスクt3 1, t3 2, t5 2, t4 1, t4 2, t6 1, t6 2, t6 3がブロックb4で処理を行う必要があるかどうかを調べるため、ブロックb4を集合{b4}として表し、{b4}とブロック集合B3 1(1), B3 2, B5 2, B4 1, B4 2, B6 1, B6 2, B6 3との間でそれぞれ積集合(∩)を求めると次のようになる。
タスクt3 2に対して: B3 2 ∩ {b4} = {b4}
タスクt5 2に対して: B5 2 ∩ {b4} = {}
タスクt4 1に対して: B4 1 ∩ {b4} = {}
タスクt4 2に対して: B4 2 ∩ {b4} = {b4}
タスクt6 1に対して: B6 1 ∩ {b4} = {}
タスクt6 2に対して: B6 2 ∩ {b4} = {}
タスクt6 3に対して: B6 3 ∩ {b4} = {}
タスクt3 2の検索処理は、レコードD.r19を検索することである。そのためメインメモリに読み込まれたレコードD.r19に対して、タスクt3 2と同じトランザクションT3に含まれるタスクt3 1の更新処理が先に行われると、タスクt4 2の更新処理が行われる前に、タスクt3 1によるレコードD.r19の更新結果を、タスクt3 2の検索結果として取り出すことになる。
タスクt3 1に対して: B3 1(2) ← B3 1(1) - {b4}, B3 1(2) = {}
タスクt3 2に対して: B3 2(1) ← B3 2 - {b4}, B3 2(1) = {}
タスクt4 2に対して: B4 2(1) ← B4 2 - {b4}, B4 2(1) = {}
この結果、ブロック集合B3 1(2), B3 2(1), B4 2(1)が空集合({})になり、タスクt3 1, t3 2, t4 2の処理が終了し、トランザクションT3に含まれるすべてのタスクの処理が終了することになり、トランザクションT3が終了すると、この時点でトランザクションT3をコミットできるかどうかを、図4(b)の先行グラフをもとにして決定する。接点T3には、他のどの接点からも入力枝がないので、トランザクションT3をコミットする。T3をコミットすると、接点T3と接点T3から出力している枝を図4(b)の先行グラフから削除し、その結果を図4(c)の先行グラフとして表わすことができる。
次に、リレーションDEPARTMENT内のブロックの格納位置が512であるブロックb3内のデータをディスクからメインメモリに読み込み、すでに処理が終了したタスクt2 1, t2 2, t1 1, t1 2,t3 1,t3 2, t5 1, t4 2 以外のグループ内のタスクt5 2, t4 1, t6 1, t6 2, t6 3がブロックb3で処理を行う必要があるかどうかを調べるため、ブロックb3を集合{b3}として表し、この{b3}とブロック集合B5 2, B4 1, B6 1, B6 2, B6 3との間でそれぞれ積集合(∩) を求めると次のようになる。
タスクt4 1に対して: B4 1 ∩ {b3} = {}
タスクt6 1に対して: B6 1 ∩ {b3} = {b3}
タスクt6 2に対して: B6 2 ∩ {b3} = {}
タスクt6 3に対して: B6 3 ∩ {b3} = {}
タスクt5 2は、データベースから読み込んだレコードD.r14に対して更新処理を行い、タスクt6 1は、タスクt5 2が更新したレコードD.r14に対して更新処理を行うことになる。このようにタスクt5 2,t6 1による更新処理をメインメモリ内で順次行い、タスクt6 1による最後の更新結果のみをデータベースに一度だけ書き込むことになる。
ブロックb3でのタスク t5 2,t6 1の処理が終了すると、ブロックb3を再びアクセスする必要がなくなるので、ブロック集合 B5 2, B6 1と集合{b3}との差集合を求めて、得られた差集合をB5 2(1),B6 1(1)とすると、次のようになる。
タスクt5 2に対して: B5 2(1) ← B5 2 - {b3}, B5 2(1) = {}
タスクt6 1に対して: B6 1(1) ← B6 1 - {b3}, B6 1(1) = {b1}
この結果、ブロック集合B5 2(1)が空集合({})になり、タスクt5 2の処理が終了する。
また、トランザクションT5,T6によるレコードD.r14に対する更新処理は終了したけれども、T5,T6はまだコミットしていないため、図4(d)の先行グラフ内の接点T5から接点T6へと入力しているD.r14の枝を点線の枝として残しておくことにする。
次に、リレーションDEPARTMENT内のブロックの格納位置が0であるブロックb1内のデータをディスクからメインメモリに読み込み、すでに処理が終了したタスクt2 1, t2 2, t1 1, t1 2,t3 1,t3 2, t5 1, t5 2,t4 2以外のグループ内のタスクt4 1, t6 1, t6 2, t6 3 がブロックb1で処理を行う必要があるかどうかを調べるため、ブロックb1を集合{b1}として表し、この{b1}とブロック集合B4 1, B6 1(1), B6 2, B6 3との間でそれぞれ積集合(∩) を求めると次のようになる。
タスクt4 1に対して: B4 1 ∩ {b1} = {b1}
タスクt6 1に対して: B6 1(1) ∩ {b1} = {b1}
タスクt6 2に対して: B6 2 ∩ {b1} = {}
タスクt6 3に対して: B6 3 ∩ {b1} = {}
t4 1に対して: B4 1(1) ← B4 1 - {b1}, B4 1(1) = {}
t6 1に対して: B6 1(2) ← B6 1(1) - {b1}, B6 1(2) = {}
この結果、ブロック集合B4 1(1),B6 1(2)が空集合({})になり、タスクt4 1, t6 1の処理が終了する。図4(e)の先行グラフは、トランザクションT4,T6によるレコードD.r3に対する更新処理が終了したけれども、トランザクションT4,T6の処理がまだ終了していないので、接点T4から接点T6へと入力しているD.r3の枝を点線の枝として残していることを表わしている。
最後に、リレーションDEPARTMENT内のブロックの格納位置が1024であるブロックb5内のデータをディスクからメインメモリに読み込み、ブロックb5でグループG1内の最後のタスクt6 2,t6 3の処理を行うと次のようになる。
タスクt6 2, t6 3の処理が終了すると、グループG1内のすべてのタスクの処理が終了することになる。グループG1の処理が終了すると、合成トランザクションに含まれるグループG2の処理を開始することになる。
リレーションEMPLOYEEに対するグループG2の処理は、グループG1の処理と同様に、グループG2内のタスクに対してマルチオペレーション・プロセッシングを用いて処理することになる。
図3−2のリレーションEMPLOYEE(400)の主インデックス(410)及び二次インデックス(420)を用いて、グループG2内のタスクt7 1, t1 3, t8 1, t4 3を処理するために読み出す必要のあるリレーションEMPLOYEE内のすべてのブロックを調べて、個々のタスクに対応するブロック集合B7 1, B1 3,B8 1, B4 3に集めると次のようになる。
タスクt7 1に対して、B7 1 = {b2}
タスクt1 3に対して、B1 3 = {b4}
タスクt8 1に対して、B8 1 = {b2, b3}
タスクt4 3に対して、B4 3 = {b3}
ブロック集合を見出すと、グループ内のタスクが並べられた順に、すなわちt7 1, t1 3, t8 1, t4 3の順番で各タスク対応するブロック集合の和集合を求めていくと次のようになる。
TB0 ← {} (空集合)
ブロック集合B7 1との和集合: TB7 1 ← TB0 U B7 1, TB7 1 = {b2}
ブロック集合B1 3との和集合: TB1 3 ← TB7 1 U B1 3, TB1 3 = {b2, b4}
ブロック集合B8 1との和集合: TB8 1 ← TB1 3 U B8 1, TB8 1 = {b2, b4, b3}
ブロック集合B4 3との和集合: TB4 3 ← TB8 1 U B4 3, TB4 3 = {b2, b4, b3}
以上のようにして順次和集合を求めていくと、最後の和集合TB4 3から、リレーションEMPLOYEEに対して、ブロックb2からブロックのアクセスを開始し、ブロックb3でアクセスを終了すればよいことになり、ブロックのアクセス順は(b2, b4, b3)となる。
[(c-1) ブロックb2にアクセス]
最初に、リレーションEMPLOYEE(400)内のブロックの格納位置が256であるブロックb2内のデータをディスクからメインメモリに読み込み、グループ内のタスクt7 1, t1 3, t8 1, t4 3がブロックb2で処理を行う必要があるかどうかを調べるため、ブロックb2を集合{b2}として表し、{b2}とブロック集合B7 1, B1 3, B8 1, B4 3との間でそれぞれ積集合(∩) を求めると次のようになる。
タスクt7 1に対して: B7 1 ∩ {b2} = {b2}
タスクt1 3に対して: B1 3 ∩ {b2} = {}
タスクt8 1に対して: B8 1 ∩ {b2} = {b2}
タスクt4 3に対して: B4 3 ∩ {b2} = {}
タスクt7 1に対して: B7 1(1) ← B7 1 - {b2}, B7 1(1) = {}
タスクt8 1に対して: B8 1(1) ← B8 1 - {b2}, B8 1(1) = {b3}
この結果、ブロック集合B7 1(1)が空集合({})になり、タスクt7 1の処理が終了する。タスクt7 1の処理が終了するとトランザクションT7内のすべてのタスクの処理が終了することになり、図4(f)の先行グラフをもとにして、この時点でトランザクションT7をコミットすることができるかどうかを決定する。接点T7には、他のどの接点からも入力枝がないので、トランザクションT7をコミットする。T7をコミットすると、図4(f)の先行グラフから接点T7と接点T7から出ているすべての枝を削除し、その結果を図4(g)の先行グラフとして表わすことができる。
次に、リレーションEMPLOYEE(400)内のブロックの格納位置が768であるブロックb4内のデータをディスクからメインメモリに読み込み、すでに処理が終了したタスクt7 1以外のグループ内のタスクt8 1, t1 3, t4 3がブロックb4で処理を行う必要があるかどうかを調べるため、ブロックb4を集合{b4}として表し、この{b4}とブロック集合B8 1(1), B1 3, B4 3との間でそれぞれ積集合(∩) を求めると次のようになる。
タスクt8 1に対して: B8 1(1) ∩ {b4} = {}
タスクt1 3に対して: B1 3 ∩ {b4} = {b4}
タスクt4 3に対して: B4 3 ∩ {b4} = {}
タスクt1 3に対して積集合が{b4}となり、ブロックb4で処理が可能となり、メインメモリに読み込んだブロックb4でタスクt1 3の更新処理を行うと次のようになる。
タスクt1 3に対して: B1 3(1) ← B1 3 - {b4}, B1 3(1) = {}
この結果、ブロック集合B1 3(1)が空集合({})になり、タスクt1 3の処理が終了する。タスクt1 3の処理が終了すると、トランザクションT1内のすべてのタスクの処理が終了するため、この時点でトランザクションT1がコミットできるかどうかを、図4(g)の先行グラフをもとにして決定する。接点T1には、他のどの接点からも入力枝がないので、トランザクションT1をコミットする。トランザクションT1をコミットすると、接点T1と接点T1から出力しているすべての枝も削除される。T1が削除されると、接点T1から接点T5へと入力している枝が削除され、接点T5の入力枝がすべてなくなるため、トランザクションT5もコミットすることになる。トランザクションT1, T5がコミットした結果は、図4(h)の先行グラフとして表わすことができる。
最後に、リレーションEMPLOYEE内のブロックの格納位置が512であるブロックb3内のデータをディスクからメインメモリに読み込み、ブロックb3でグループG2内に残ったタスクt8 1,t4 3の処理を行うと次のようになる。
グループG2の処理を行うには、リレーションEMPLOYEE(400)に対して、ブロックb2でタスクt7 1, t8 1の処理を行ってトランザクションT7が終了してコミットし、ブロックb4でタスクt1 3の処理を行ってトランザクションT1が終了してトランザクションT1,T5がコミットし、ブロックb3でタスクt8 1, t4 3の処理を行ってトランザクションT8,T4の処理が終了してトランザクションT8, T4, T6がコミットする。
また、上記の具体例では、readとwriteを基本とするトランザクションの更新処理を扱った。実際の更新処理には、データの挿入や削除も行われる。マルチオペレーション・プロセッシングを用いてデータの挿入を行うには、データを挿入するブロックの格納位置を調べて、そのブロックに十分なスペースがある場合は、ブロックのアクセス順にしたがってそのブロックをアクセスした際に、データを挿入することになる。また、マルチオペレーション・プロセッシングを用いてデータの削除を行うには、データを削除するブロックの格納位置を調べて、ブロックのアクセス順にしたがってそのブロックをアクセスした際に、データを削除することになる。
合成トランザクションの処理を行っている間に、新たに別のトランザクションがいくつか到着すると、到着した複数のトランザクションに対して合成トランザクションが作成され、現在処理が行われている合成トランザクションと一緒に処理が行われると、複数の合成トランザクションの間でデータの矛盾が起こる可能性が出てくる。
例えば、合成トランザクションTG1,G2の処理を行っている間に、図1のトランザクション処理システム(100)に、新たにトランザクションT9,T10,T11が到着すると、トランザクションT9,T10,T11に対して合成トランザクションTG3,G4,G5を作成したとする。マルチオペレーション・プロセッサ(102)は、現在プロセス1とプロセス2を用いて合成トランザクションTG1,G2の処理を行っていたとすると、残ったプロセス3とプロセス4とプロセス5を用いて合成トランザクションTG3,G4,G5の処理を行うことになる。合成トランザクションTG1,G2と合成トランザクションTG3,G4,G5が同一のデータ項目に対して処理を行う必要がある場合、同時にデータが更新されてデータの矛盾が起こる可能性が出てくる。
複数の合成トランザクションの処理が競合してデータの矛盾が起こるといった問題を解決するために、二相ロックを用いたマルチオペレーション・プロセッシングとタイムスタンプを用いたマルチオペレーション・プロセッシングを提案する。
二相ロックを用いたマルチオペレーション・プロセッシングは、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングに、二相ロックを加えたものである。二相ロックを用いたマルチオペレーション・プロセッシングは、合成トランザクションが処理を行う個々のデータ項目に対してロックをかけて処理を行う手法である。ロックの操作は、ロックをかける操作だけからなる成長相とロックをはずす操作だけからなる縮退相と分離して行う。そのため一度ロックをはずした後に、再びロックをかけることはない。なお、ロックをかけるにあたって、検索処理しか行わないデータ項目に対しては、共有ロックをかけ、更新処理を行うデータ項目に対しては、専有ロックをかけることになる。複数の合成トランザクションの間でデータの矛盾が起こらないようにするには、個々の合成トランザクションは、二相ロックを用いたマルチオペレーション・プロセッシングを使用して処理を行うことになる。
また、複数の合成トランザクションの間でデッドロックが生じた場合の対処は、従来のデッドロックの対処と異なる。複数の合成トランザクションの間でデッドロックが生じた場合、デッドロックの関係にある合成トランザクションの1つを中断することになり、中断する合成トランザクションは、合成トランザクションに含まれるトランザクションの中で、コミットしたトランザクションの数が最も少ない合成トランザクションを中断することになる。合成トランザクションの処理を中断するには、合成トランザクションに含まれるトランザクションの中で、すでにコミットしたトランザクションはそのままにしておき、まだコミットしていないトランザクションのみを中断してロールバックし、中断したトランザクションは、トランザクション処理システム(100)に再提出することになる。
図5−1,図5−2は、二相ロックを用いたマルチオペレーション・プロセッシングを使用して2つの合成トランザクションT G1,G2, TG3,G4,G5の処理を同時に並行して実行しているものを表わしている。合成トランザクションT G1,G2は1.2章の具体列で用いた合計2つのリレーションDEPARTMENT(300), EMPLOYEE(400)に対して処理を行う合成トランザクションであり、合成トランザクションTG3,G4,G5は、図1のトランザクション処理システム(100)に新たに到着したトランザクションT9,T10,T11から作成された合計3つのリレーションPROJECT,EMPLOYEE,DEPARTEMTに対して処理を行う合成トランザクションである。
図5−1,図5−2において、レコードrに対して共有ロックをかける操作をread_lock(r)として表わし、レコードrに対して専有ロックをかける操作をwrite_lock(r)として表わし、レコードrに対してロックをはずす操作をunlock(r)として表わしている。また、リレーションDEPARTMENT(300)内のレコードは、D.riとして表わし、リレーションEMPLOYEE(400)内のレコードはE.riとして表わし、リレーションPROJECT(図示せず)内のレコードはP.riと表わすことにする。
合成トランザクションTG3,G4,G5の処理も同様に、時間経過とともに、レコードP.r9,P.r18,E.r11,E.r21,D.r13,D.r14,D.r15,D.r19の順番にロックをかけ、すべてのロックをかけた後に、マルチオペレーション・プロセッシングによるレコードの処理が終了したレコードから順番にロックをはずしている。合成トランザクションTG1,G2と合成トランザクションTG3,G4,G5に含まれるトランザクションは、T2, T9, T3, T11,T10,T7,T1,T5,T8,T4,T6の順番でコミットしている。
このデッドロックを解除するには、合成トランザクションTG1,G2,又は合成トランザクションTG3,G4,G5のどちらかを中断することになるが、合成トランザクションTG1,G2は、1つのトランザクションT2をすでにコミットしていて、合成トランザクションTG3,G4,G5は2つのトランザクションT11,T9をすでにコミットしているため、コミットしたトランザクションの数が少ない方の合成トランザクションTG1,G2の処理を中断することになる。合成トランザクションTG1,G2の処理を中断するには、すでにコミットしたトランザクションT2はそのままにしておき、まだコミットしていないトランザクションT7,T3,T1,T5,T8,T4,T6だけを中断してロックバックし、中断したトランザクションをトランザクション処理システム(100)に再提出することになる。
このようにして、個々の合成トランザクションに対して、二相ロックを用いたマルチオペレーション・プロセッシングを用いて処理を行うことによって、複数の合成トランザクションが同時に同一のデータ項目に対して更新処理を行うことがなくなり、データの矛盾が起こることはなくなる。
タイムスタンプを用いたマルチオペレーション・プロセッシングは、複数の合成トランザクションの処理を同時に実行するにあたって、個々の合成トランザクションにタイムスタンプを与え、タイムスタンプの小さい合成トランザクションから順番に処理していく。タイムスタンプを用いたマルチオペレーション・プロセッシングが、従来のタイムスタンプ・プロトコルと異なる点は、従来のように個々のトランザクションに対してタイムスタンプを与えるのではなく、個々の合成トランザクションに対してタイプスタンプを与えることであり、また、個々のトランザクションが処理を行うデータ項目に対してタイムスタンプを与えるのではなく、個々の合成トランザクションが処理を行うデータ項目に対してタイムスタンプを与えることである。なお、複数の合成トランザクションの間でデータの矛盾が起こった場合は、データの矛盾が起こった合成トランザクションの処理を中断することになる。合成トランザクションの処理を中断するには、合成トランザクションに含まれるトランザクションの中ですでにコミットしたトランザクションはそのままにしておき、まだコミットしていないトランザクションだけを中断してロールバックして、トランザクション処理システムに再提出することになる。
タイムスタンプを用いたマルチオペレーション・プロセッシングは、複数の合成トランザクションが処理を行うデータ項目Xに対して、読み込みタイムスタンプread_TS(X)と書き込みのタイムスタンプwrite_TS(X)を与える。
read_TS(X)は、データ項目Xを読み込むことに成功したいくつかの合成トランザクションの中で、最もタイムスタンプの大きい合成トランザクションのタイムスタンプである。
write_TS(X)は、データ項目Xを書き込むことに成功したいくつかの合成トランザクションの中で、最もタイムスタンプの大きい合成トランザクションのタイムスタンプである。
合成トランザクションのタイムスタンプは、TS(TG1,G2,…Gn)として表わし、合成トランザクションに含まれる個々のトランザクションに対してタイムスタンプ(到着時間)を与え、タイムスタンプを与えられたトランザクションの中で、最もタイムスタンプの大きいトランザクションのタイムスタンプを合成トランザクションのタイムスタンプとする。
合成トランザクションTG1,G2,…Gnがデータ項目Xに対して書き込み処理write_item(X)、読み込み処理read_item(X)を行う場合は、次の規約に従って実行していくことになる。
合成トランザクションTG1,G2,…Gnがデータ項目Xに対しての書き込み処理write_item(X)を要求した場合
a.read_TS(X) > TS(TG1,G2,…Gn)、又はwrite_TS(X) > TS(TG1,G2,…Gn)であるならば、合成トランザクションTG1,G2,…Gnの処理を中断し、合成トランザクションTG1,G2,…Gnに含まれるトランザクションの中で、まだコミットしていないトランザクションの処理を中断する。中断したトランザクションはロールバックし、トランザクション処理システムに再提出する。
b.aの条件を満たさない場合は、合成トランザクションTG1,G2,…Gnのwrite_item(X)を実行し、write_TS(X)の値をTS(TG1,G2,…Gn)とする。
合成トランザクションTG1,G2,…Gnがデータ項目Xに対して読み込み処理read_item(X)を要求した場合
a.write_TS(X) > TS(TG1,G2,…Gn)であるならば、合成トランザクションTG1,G2,…Gnの処理を中断し、TG1,G2,…Gnに含まれるトランザクションの中でまだコミットされていないトランザクションの処理を中断する。中断したトランザクションはロールバックし、トランザクション処理システムに再提出する。
b.write_TS(X) ≦ TS(TG1,G2,…Gn)であるならば、TG1,G2,…Gnのread_item(X)を実行し、TS(TG1,G2,…Gn)の値がread_TS(X)よりも大きければ、read_TS(X)の値をTS(TG1,G2,…Gn)とする。
次に、タイムスタンプを用いたマルチオペレーション・プロセッシングの手順を用いて、合成トランザクションTG1,G2と合成トランザクションTG3,G4,G5の処理を同時に行った場合について説明することにする。
図7は、タイムスタンプを用いたマルチオペレーション・プロセッシングを使用して合成トランザクションTG1,G2と合成トランザクションTG3,G4,G5の処理を同時に実行しているのを表わしている。
合成トランザクションTG3,G4,G5は、レコードD.r19に対して更新処理を行うにあたって、合成トランザクションTG1,G2がレコードD.r19を読み出した(S704)後に、レコードD.r19を読み出している(S706)けれども、合成トランザクションTG1,G2よりも先にレコードD.r19を書き込んでいる(S708)。そのため、その後に、合成トランザクションTG1,G2がレコードD.r19を書き込む(S709)と、合成トランザクションTG3,G4,G5が書き込んだr19に対する値が上書きされるため、合成トランザクションTG1,G2の処理を中断することになる。タイムスタンプを用いたマルチオペレーション・プロセッシングがどのようにして、このデータの矛盾を見つけるかは次に述べるとおりである。
次に、合成トランザクションTG3,G4,G5がレコードD.r19を読み出す(S705)ときに、write_TS(D.r19)の値が0であったとすると、TS(TG3,G4,G5)の値は11であり、ケース2のbの条件write_TS(D.r19) ≦ TS(TG5)を満たすために、read_item(D.r19)を実行し(S705)、read_TS(D.r19)の値を8から11にする(S706)。
合成トランザクションTG1,G2を中断するには、合成トランザクションTG1,G2に含まれるトランザクションの中ですでにコミットしたトランザクションT2はそのままにしておき、まだコミットしていないトランザクションT7, T3, T1, T5, T8, T4, T6の処理を中断し、ロールバックすることになる。中断されたトランザクションT7, T3, T1, T5, T8, T4, T6は、トランザクション処理システムに再提出する。
このようにして、タイムスタンプを用いて複数の合成トランザクションの処理を行うのがタイムスタンプを用いたマルチオペレーション・プロセッシングである。
結合演算の処理を行うクエリーなど、複雑で高度なクエリーがトランザクションに含まれている場合、どのようにしてトランザクションを処理するかを、具体例を用いて説明する。図3−1のリレーションDEPARTMENT(300)と図3−2のリレーションEMPLOYEE(400)に対して、下記に示すような処理を行う3つのトランザクションT12,T13,T14がトランザクション処理システムに入力されたとする。
-- T12の更新処理1
UPDATE DEPARTMENT
SET BUDGET = BUDGET + 9000
WHERE DNUMBER = 7;
-- T12の更新処理2
UPDATE EMPLOYEE
SET MGRSSN = 470191111
WHERE SSN > 1876767888 AND SSN < 2111111124;
-- T12のクエリー1
SELECT *
FROM DEPARTMENT, EMPLOYEE
WHERE DNUMBER = 7 AND
SSN > 2111111124 AND SSN < 2411111133 AND
DNUMBER = DNUM;
COMMIT WORK;
-- T13の更新処理1
UPDATE EMPLOYEE
SET DNUM = 8
WHERE SSN = 2311111132;
COMMIT WORK;
-- T13のクエリー1
SELECT *
FROM DEPARTMENT, EMPLOYEE
WHERE DPHONE = '23-3711' AND
SSN > 2834567894 AND DNUM = DNUMBER;
-- T13の更新処理2
UPDATE DEPARTMENT -- T2の更新処理1
SET DNAME = 'SHIPPING'
WHERE DNUMBER = 7;
COMMIT WORK;
-- T14の更新処理1
UPDATE EMPLOYEE
SET PHONE = '23-5600'
WHERE SSN = 2311111132;
-- T14の更新処理2
UPDATE DEPARTMENT
SET BUDGET = BUDGET + 4000
WHERE DNUMBER > 6 AND DNUMBER < 9;
COMMIT WORK;
処理ツリーを作成すると、トランザクション処理システムは、トランザクションT12,T13,T14に対して、トランザクションに含まれる部分処理をタスクとして表わし、トランザクションの部分処理を作成すると次のようになる。
(t12 1):read_item(D.r7);
D.r7.BUDGET := D.r7. BUDGET + 9000;
write_item(D.r7);
(t12 2):read_item(E.r9);
E.r9.MGRSSN := 470191111;
write_item(E.r9);
read_item(E.r10);
E.r10.MGRSSN := 470191111;
write_item(E.r10);
(t12 3):read_item(D.r7);
(t12 4):read_item(E.r12);
read_item(E.r13);
(t12 5):TEMP_T12_3 |X|DNUMBER=DNUMTEMP_T12_4;
(t13 1):read_item(E.r13);
E.r13.DNUM = 8;
write_item(E.r13);
(t13 2):read_item(D.r6);
(t13 3):read_item(E.r19);
read_item(E.r20);
(t13 4):TEMP_T13_2 |X|DNUMBER=DNUMTEMP_T13_3;
(t13 5):read_item(D.r7);
D.r7.DNAME := 'SHIPPING';
write_item(D.r7);
(t14 1):read_item(E.r13);
E.r13.PHONE := '23-5600';
write_item(E.r13);
(t14 2):read_item(D.r7);
D.r7.BUDGET := D.r7.BUDGET + 4000;
write_item(D.r7);
read_item(D.r8);
D.r8.BUDGET := D.r8.BUDGET + 4000;
write_item(D.r8);
上記のタスクt12 4は、図8(a)の処理ツリー内の選択演算σSSN>2111111124 AND SSN<2411111133 EMPLOYEEを処理するためのタスクである。
上記のタスクt13 2は、図8(b)の処理ツリー内の選択演算σDPHONE = '23-3711'DEPARTMENTを処理するためのタスクである。
上記のタスクt13 3は、図8(b)の処理ツリー内の選択演算σSSN > 2834567894EMPLOYEEを処理するためのタスクである。
上記のタスクt13 4は、図8(b)の処理ツリー内の結合演算であり、トランザクションの部分処理ではTEMP_T13_2 |X|DNUMBER=DNUMTEMP_T13_3としておく。TEMP_T13_2は、タスクt13 2の選択処理を行ったときに作成される一時表であり、TEMP_T13_3はタスクt13 3の選択処理を行ったときに作成される一時表である。タスクt12 5の結合処理は一時表TEMP_T13_2,TEMP_T13_3ができたときに、実行されることになる。
トランザクションT12の処理コストを6とし、トランザクションT13の処理コストを5とし、トランザクションT14の処理コストを2とした場合、トランザクションの実行順をT14,T13,T12と決定することができる。
トランザクションT13,T12は同一のレコードD.r7,E.r13に対して処理を行うため、トランザクションの実行順に接点T13から接点T12へと枝を入力する。
トランザクションT14,T13は同一のレコードD.r7,E.r13に対して処理を行うため、トランザクションの実行順に接点T14から接点T13へと枝を入力する。
トランザクションT14,T12は同一のレコードE.r13に対して処理を行うため、トランザクションの実行順に接点T14から接点T12へと枝を入力する。
DEPARTMENT: グループ G6 = {t14 2, t13 2, t13 5, t12 1, t12 3}
EMPLOYEE: グループ G7 = {t14 1, t13 1, t13 3, t12 2, t12 4}
TEMP_T13_3: グループ G8 = {t13 4}
TEMP_T12_4: グループ G9 = {t12 5}
タスクがグループ分けされて、グループG6,G7,G8,G9が作成されると、グループG6,G7,G8,G9を用いて合成トランザクションTG6,G7,G8,G9を作成し、合成トランザクションTG6,G7,G8,G9に含まれる個々のグループに対して、第一章で述べたマルチオペレーション・プロセッシングを用いて処理することになる。
また、グループG9内のタスクt12 5の結合処理はグループG6内のタスクt12 3の選択処理とグループG7内のタスクt12 4の選択処理が終了してから始めることになる。
最初にグループG6とグループG7の処理が終了すると、トランザクションT14内のすべてのタスクの処理が終了することになるので、トランザクションT14の処理が終了してコミットすることになる。トランザクションT14がコミットすると、図13(c)の先行グラフから接点T14とその接点から出ているすべての枝を削除する。その結果は、図13(d)の先行グラフとして表わすことができる。
最後にグループG9の結合処理が終了してタスクt12 5の処理が終了すると、トランザクションT12内のすべてのタスクが終了するので、トランザクションT12の処理が終了してコミットすることになる。その結果、合成トランザクションTG6,G7,G8,G9の処理が完了し、入力されたトランザクションT12,T13,T14の処理がすべて終了し、コミットしたことになる。
本章では、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングによるトランザクション処理の評価のために行った実験とその結果について考察する。実験では、第1章で述べた本発明のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングによるトランザクションの処理時間と、トランザクションの処理を別々に行う従来の二相ロック・プロトコルによるトランザクションの処理時間を測定し、両者の処理時間を比較した。
次に、独自のクライアントプログラムを作成し、クライアントプログラムからSQLで記述された数多くのトランザクションをデータベース・サーバーに入力し、データベース・サーバーによってすべてのトランザクションが処理されてコミットするまでの時間を測定して、それぞれの手法によるトランザクションの処理時間を求めた。
各リレーションに100万件ずつレコードを格納し、6つのリレーションに対して合計600万件ほどのレコードをデータベースに加え、データベースに同時に問い合わせるトランザクションの数を1000件から10000件まで変化させたときの処理時間を図9(a).(b)の表とグラフに示した。トランザクションの処理時間が速くなることは処理速度が速くなることであると考えると、トランザクションの数が1000件から10000件までの件数において、全体的にトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングの処理速度のほうが従来の二相ロック・プロトコルの処理速度よりも速いことがわかる。トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングは、トランザクションの数が1000件から5000件までは、図9(a)の表から、従来の二相ロック・プロトコルの処理速度よりも平均して18.36倍の処理速度が得られ、トランザクションの数が6000件から10000件までは、従来の二相ロック・プロトコルの処理速度よりも平均して19.98倍の処理速度が得られた。
図9(b)のグラフに示すように、従来の二相ロック・プロトコルは、トランザクションの数が増えると、数多くのトランザクションが同一のデータ項目を何度も繰り返して読み出し、読み出したレコードに対して更新処理を別々に行い、更新された結果を何度も繰り返してデータベースに書き込むため、トランザクションの処理速度が低下することになった。
一方、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングは、同時に処理するトランザクションの数が増加すると、複数のトランザクションが処理を行う同一のデータ項目を一度だけ読み出し、読み出したレコードに対して複数のトランザクションの更新処理を順次メインメモリ内で行い、最後に更新された結果だけをデータベースに一度だけしか書き込まないので、トランザクションの処理速度が向上した。
データベースの6つのリレーションに格納されるレコード数を60万件から600万件へと変化させ、それぞれのサイズのデータベースに10000件のトランザクションの処理を一度に要求したときの処理時間を図10(a).(b)の表とグラフに示した。
図10(a).(b)の表とグラフに示すように、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングは、レコード数が60万件から300万件までは、従来の二相ロック・プロトコルの処理速度よりも平均して8.04倍の処理速度が得られ、レコード数が360万件から600万件までは、従来の二相ロック・プロトコルの処理速度よりも平均して15.59倍の処理速度が得られ、データベースのサイズが大きくなるにつれて、処理速度が向上していく傾向がある。従来の二相ロック・プロトコルは、データベースのサイズが大きくなるにつれ、個々のトランザクションの処理に時間がかかるようになった。一方、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングは、データベースのサイズに関係なく効率よく個々の合成トランザクションの処理を実行することができた。
トランザクション処理システムに入力された複数のトランザクションを処理するにあたって、個々のトランザクションを別々に処理することによって発生する従来の問題を解決するために、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを提案した。
このシステムは、トランザクション処理システムに複数のトランザクションが入力されると、入力されたトランザクションに対して、トランザクションの部分処理を求め、トランザクションの実行順を決定し、決定した順にデータを更新することを示した先行グラフを作成し、トランザクションに含まれる個々の部分処理をタスクとして取り出し、取り出したタスクを、トランザクションの実行順にデータベースのリレーションごとにグループ分けし、グループ分けして作成したグループを用いて合成トランザクションを作成し、合成トランザクションに含まれる個々のグループに対してマルチオペレーション・プロセッシングを用いて処理を行っていくシステムである。
ブロック内のデータ項目に対して、グループ内のタスクが並んだ順にタスク処理を順次行っていくということは、ブロック内のデータ項目が先行グラフに存在する場合、そのデータ項目に対して先行グラフに示したトランザクションの実行順にトランザクションの部分処理であるタスク処理を順次行っていくことであり、複数のタスクがそのデータ項目に対して更新処理を行う場合、そのデータ項目に対して最初のタスクの更新処理を行い、更新されたデータ項目に対して次のタスクの更新処理を行い、このような更新処理を繰り返し、最後のタスクの更新処理が行われると、最後に更新された更新結果だけをデータベースに書き込んでいくことである。
本発明のシステムは、複数のトランザクションが処理を行うデータ項目に対して、そのデータ項目を一度だけ検索し、検索したデータ項目に対して、複数のトランザクションの更新処理を順次メインメモリ内で行い、最後に更新した結果だけをデータベースに一度だけ書き込めばよいので、極めて効率的に複数のトランザクションの処理を行うことができるようになった。
本発明は、入力された複数のトランザクションに対して、サイクルを含んでいない先行グラフを作成し、複数のトランザクションによって処理されるデータ項目に対して、先行グラフに示したトランザクションの実行順にトランザクションの処理を順次行っていくので、入力された複数のトランザクションは直列可能スケジュール(serializable schedule)で処理される。
本発明は、入力された複数のトランザクションに対して1つの合成トランザクションを作成し、合成トランザクションの処理を行っていくことができ、1つの合成トランザクションの処理が終了した段階で、新たに複数のトランザクションが入力されると、それらのトランザクションに対して別の合成トランザクションを作成し、その合成トランザクションの処理を行っていくことができるので、合成トランザクションの処理を1つずつ実行していく場合には、ロックを用いる必要はなくなる。また、デッドロックなどを発生することもなく、合成トランザクションに含まれる複数のグループの処理を同時に並行して実行していくことができるようになった。
合成トランザクションを1つずつ実行していくことで十分にトランザクションの処理速度を向上させることができるが、CPUやディスクなどハードウェア資源を効率よく利用することを考慮する場合には、複数の合成トランザクションを同時に並行して実行することを取り上げ、これらの複数の合成トランザクションの処理を同時に並行して実行するために、二相ロックを用いたマルチオペレーション・プロセッシングとタイムスタンプを用いたマルチオペレーション・プロセッシングを提案した。
Claims (4)
- トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムであって、
入力された複数のトランザクションに対してトランザクションの実行順を決定するトランザクション実行順決定手段と、
前記複数のトランザクションが同一のデータ項目に対して処理を行う場合、そのデータ項目に対する枝を作成し、先に処理を行うトランザクションの接点から次に処理を行うトランザクションの接点にその枝を入力して、前記トランザクションの実行順にデータを更新することを示した先行グラフを作成する先行グラフ作成手段と、
前記複数のトランザクションに含まれる部分処理をタスクとして取り出すタスク取り出し手段と、
前記取り出したタスクを、前記トランザクションの実行順に、前記データベースのアクセス領域ごとにグループ分けするグループ分け手段と、
前記グループ分けして作成したグループを用いて合成トランザクションを作成する合成トランザクション作成手段と、
前記合成トランザクションに含まれる個々のグループに対してマルチオペレーション・プロセッシングを用いて処理を行うマルチオペレーション・プロセッシング手段と
を備え、
前記マルチオペレーション・プロセッシング手段は、グループ分けされたタスクがアクセスするアクセス領域内のブロックを調べ、グループ内のタスクが並んでいる順に該ブロックへのアクセス順を決定し、決定したアクセス順に該ブロックを読み出し、読み出したブロックにアクセスするタスクをグループ内から抽出し、ブロック内のデータ項目に対して、グループ内のタスクが並んでいる順にタスク処理を順次行い、グループ分けされたタスクの処理が終了し、グループ分けされたタスクを包含するトランザクションの処理が終了すると、その時点で終了したトランザクションをコミットするかどうかを、前記先行グラフの終了したトランザクションの接点に入力枝が存在するかどうかで決定し、該トランザクションの接点に入力枝が存在しない場合は、該トランザクションをコミットし、該トランザクションの接点とその接点から出ているすべての枝を削除し、
ブロック内のデータ項目に対して、グループ内のタスクが並んでいる順にタスク処理を順次行っていくということは、ブロック内のデータ項目が前記先行グラフに存在する場合、そのデータ項目に対して前記先行グラフに示したトランザクションの実行順にトランザクションの部分処理であるタスクの処理を順次行っていくことであり、
複数のタスクがそのデータ項目に対して更新処理を行う場合、そのデータ項目に対して最初のタスクの更新処理を行い、更新されたデータ項目に対して次のタスクの更新処理を行い、このような更新処理を繰り返し、最後のタスクの更新処理が行われると、最後に更新された更新結果だけをデータベースに書き込む
ことを特徴とするトランザクション処理システム。 - 請求項1に記載のトランザクション処理システムにおいて、
2相ロック・プロトコル又はタイムスタンプ・プロトコルを用いて複数の合成トランザクションの処理を同時に並行して実行することを特徴とするトランザクション処理システム。 - 請求項1又は2に記載のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムの各機能を、コンピュータ・システムに実現させるためのプログラム。
- 請求項1又は2に記載のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムの各機能を、コンピュータ・システムに実現させるためのプログラムを記録した記録媒体。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2008120540A JP4261609B1 (ja) | 2008-05-02 | 2008-05-02 | トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システム |
US12/453,188 US7899799B2 (en) | 2008-05-02 | 2009-05-01 | Transaction processing system of database using multi-operation processing providing concurrency control of transactions |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2008120540A JP4261609B1 (ja) | 2008-05-02 | 2008-05-02 | トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP4261609B1 true JP4261609B1 (ja) | 2009-04-30 |
JP2009271665A JP2009271665A (ja) | 2009-11-19 |
Family
ID=40666685
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2008120540A Expired - Fee Related JP4261609B1 (ja) | 2008-05-02 | 2008-05-02 | トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システム |
Country Status (2)
Country | Link |
---|---|
US (1) | US7899799B2 (ja) |
JP (1) | JP4261609B1 (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7899799B2 (en) | 2008-05-02 | 2011-03-01 | Toru Furuya | Transaction processing system of database using multi-operation processing providing concurrency control of transactions |
JP2013506199A (ja) * | 2009-09-25 | 2013-02-21 | アビニシオ テクノロジー エルエルシー | グラフベース・アプリケーションにおけるトランザクションの処理 |
Families Citing this family (36)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8549536B2 (en) * | 2009-11-30 | 2013-10-01 | Autonomy, Inc. | Performing a workflow having a set of dependancy-related predefined activities on a plurality of task servers |
US8356007B2 (en) | 2010-10-20 | 2013-01-15 | Microsoft Corporation | Distributed transaction management for database systems with multiversioning |
US8396831B2 (en) * | 2009-12-18 | 2013-03-12 | Microsoft Corporation | Optimistic serializable snapshot isolation |
US8386421B2 (en) | 2010-06-28 | 2013-02-26 | Microsoft Corporation | Concurrency control for confluent trees |
JP5536568B2 (ja) | 2010-07-01 | 2014-07-02 | インターナショナル・ビジネス・マシーンズ・コーポレーション | トランザクションを集約して処理する方法、システム、およびプログラム |
US8412689B2 (en) * | 2010-07-07 | 2013-04-02 | Microsoft Corporation | Shared log-structured multi-version transactional datastore with metadata to enable melding trees |
US9848106B2 (en) | 2010-12-21 | 2017-12-19 | Microsoft Technology Licensing, Llc | Intelligent gameplay photo capture |
JP5652228B2 (ja) | 2011-01-25 | 2015-01-14 | 富士通株式会社 | データベースサーバ装置、データベース更新方法及びデータベース更新プログラム |
US8504542B2 (en) * | 2011-09-02 | 2013-08-06 | Palantir Technologies, Inc. | Multi-row transactions |
US8738964B2 (en) * | 2011-12-13 | 2014-05-27 | Red Hat, Inc. | Disk-free recovery of XA transactions for in-memory data grids |
US9208190B2 (en) * | 2012-05-03 | 2015-12-08 | Red Hat, Inc. | Lock reordering for optimistic locking of data on a single node to avoid transaction deadlock |
GB2504109B (en) | 2012-07-18 | 2020-02-12 | Open Cloud Nz Ltd | Combining scalability across multiple resources in a transaction processing system having global serializability |
US20140040219A1 (en) * | 2012-07-31 | 2014-02-06 | Hideaki Kimura | Methods and systems for a deadlock resolution engine |
US11151164B2 (en) * | 2013-03-13 | 2021-10-19 | International Business Machines Corporation | Replication group partitioning |
US9477557B2 (en) | 2013-03-28 | 2016-10-25 | Microsoft Technology Licensing, Llc | Transaction processing using torn write detection |
US10262078B2 (en) * | 2014-02-10 | 2019-04-16 | Apple Inc. | Systems and methods for optimizing performance of graph operations |
GB2523357A (en) | 2014-02-21 | 2015-08-26 | Ibm | Shared resource updating method and system |
US10928970B2 (en) | 2014-07-18 | 2021-02-23 | Apple Inc. | User-interface for developing applications that apply machine learning |
US10552402B2 (en) | 2014-11-25 | 2020-02-04 | Amarnadh Sai Eluri | Database lockless index for accessing multi-version concurrency control data |
US10127260B2 (en) * | 2014-11-25 | 2018-11-13 | Sap Se | In-memory database system providing lockless read and write operations for OLAP and OLTP transactions |
US10474648B2 (en) | 2014-11-25 | 2019-11-12 | Sap Se | Migration of unified table metadata graph nodes |
US10558495B2 (en) | 2014-11-25 | 2020-02-11 | Sap Se | Variable sized database dictionary block encoding |
US10296611B2 (en) | 2014-11-25 | 2019-05-21 | David Wein | Optimized rollover processes to accommodate a change in value identifier bit size and related system reload processes |
US10725987B2 (en) * | 2014-11-25 | 2020-07-28 | Sap Se | Forced ordering of a dictionary storing row identifier values |
US10255309B2 (en) | 2014-11-25 | 2019-04-09 | Sap Se | Versioned insert only hash table for in-memory columnar stores |
US10108623B2 (en) * | 2014-12-12 | 2018-10-23 | International Business Machines Corporation | Merging database operations for serializable transaction execution |
JP6515753B2 (ja) | 2015-09-07 | 2019-05-22 | 富士通株式会社 | データベース制御プログラム、データベース制御方法及びデータベース制御装置 |
US10706065B2 (en) * | 2016-04-05 | 2020-07-07 | Sap Se | Optimizing transformation of data |
US10248685B2 (en) * | 2016-08-31 | 2019-04-02 | Oracle International Corporation | Efficient determination of committed changes |
US10303788B2 (en) * | 2016-08-31 | 2019-05-28 | Oracle International Corporation | Efficient determination of committed changes |
US11379525B1 (en) * | 2017-11-22 | 2022-07-05 | Palantir Technologies Inc. | Continuous builds of derived datasets in response to other dataset updates |
CN111125240B (zh) * | 2018-10-31 | 2023-09-01 | 北京金山云网络技术有限公司 | 一种分布式事务实现方法、装置、电子设备及存储介质 |
US11580444B2 (en) | 2019-04-16 | 2023-02-14 | Apple Inc. | Data visualization machine learning model performance |
US11397727B2 (en) * | 2019-06-03 | 2022-07-26 | Shopify Inc. | Processing late arriving and out of order data |
US11188266B2 (en) | 2020-04-20 | 2021-11-30 | Netapp Inc. | Write ordering for persistent memory |
WO2024059352A1 (en) * | 2023-01-25 | 2024-03-21 | Futurewei Technologies, Inc. | Reference-managed concurrency control |
Family Cites Families (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5280619A (en) * | 1990-05-17 | 1994-01-18 | Texas Instruments Incorporated | System for accessing shared data using a serialization graph constructed from a history file showing completed locking dependencies between transactions |
US5701480A (en) * | 1991-10-17 | 1997-12-23 | Digital Equipment Corporation | Distributed multi-version commitment ordering protocols for guaranteeing serializability during transaction processing |
JP3747477B2 (ja) | 1993-09-09 | 2006-02-22 | 株式会社日立製作所 | 排他制御方法及びこれを実現するシステム |
JP3011001B2 (ja) | 1993-12-28 | 2000-02-21 | 日本電気株式会社 | バッファ制御システム |
FR2751106B1 (fr) * | 1996-07-11 | 1999-01-08 | Alsthom Cge Alcatel | Methode de planification de transactions distribuees |
JP3255081B2 (ja) | 1997-05-14 | 2002-02-12 | 日本電気株式会社 | ファイルアクセス装置及びプログラムを記録した機械読み取り可能な記録媒体 |
US5983225A (en) * | 1998-01-26 | 1999-11-09 | Telenor As | Parameterized lock management system and method for conditional conflict serializability of transactions |
US6078982A (en) * | 1998-03-24 | 2000-06-20 | Hewlett-Packard Company | Pre-locking scheme for allowing consistent and concurrent workflow process execution in a workflow management system |
JP2000163294A (ja) | 1998-11-30 | 2000-06-16 | Nec Corp | データベース管理方法及びその装置並びにプログラムを記録した機械読み取り可能な記録媒体 |
JP2002032249A (ja) | 2000-07-19 | 2002-01-31 | Ricoh Co Ltd | 排他制御方法、排他制御装置、排他制御プログラムを記録した記録媒体、並びに、データベースシステム |
US7103597B2 (en) * | 2002-10-03 | 2006-09-05 | Mcgoveran David O | Adaptive transaction manager for complex transactions and business process |
JP4077329B2 (ja) | 2003-01-31 | 2008-04-16 | 株式会社東芝 | トランザクション処理システム、並行制御方法及びプログラム |
US7363541B2 (en) * | 2004-02-23 | 2008-04-22 | Hewlett-Packard Development Company, L.P. | Command management using task attributes |
US7860847B2 (en) * | 2006-11-17 | 2010-12-28 | Microsoft Corporation | Exception ordering in contention management to support speculative sequential semantics |
JP4109305B1 (ja) | 2006-12-28 | 2008-07-02 | 透 降矢 | マルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム |
JP4071816B1 (ja) | 2007-03-22 | 2008-04-02 | 透 降矢 | 合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム |
JP4073033B1 (ja) * | 2007-04-27 | 2008-04-09 | 透 降矢 | 結合演算の処理機能の向上を考慮した合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム |
JP4261609B1 (ja) | 2008-05-02 | 2009-04-30 | 透 降矢 | トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システム |
-
2008
- 2008-05-02 JP JP2008120540A patent/JP4261609B1/ja not_active Expired - Fee Related
-
2009
- 2009-05-01 US US12/453,188 patent/US7899799B2/en active Active
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7899799B2 (en) | 2008-05-02 | 2011-03-01 | Toru Furuya | Transaction processing system of database using multi-operation processing providing concurrency control of transactions |
JP2013506199A (ja) * | 2009-09-25 | 2013-02-21 | アビニシオ テクノロジー エルエルシー | グラフベース・アプリケーションにおけるトランザクションの処理 |
Also Published As
Publication number | Publication date |
---|---|
JP2009271665A (ja) | 2009-11-19 |
US20090287703A1 (en) | 2009-11-19 |
US7899799B2 (en) | 2011-03-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4261609B1 (ja) | トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システム | |
Wang et al. | Scaling multicore databases via constrained parallel execution | |
CN107977376B (zh) | 分布式数据库系统及事务处理方法 | |
Tu et al. | Speedy transactions in multicore in-memory databases | |
Ozsoyoglu et al. | Temporal and real-time databases: A survey | |
WO1999038095A1 (en) | Database management system and method for conditional conflict serializability of transactions and for combining meta-data of varying degrees of reliability | |
JP4425377B2 (ja) | データ処理装置、および、データ処理方法 | |
Fatourou et al. | Persistent non-blocking binary search trees supporting wait-free range queries | |
Sheng et al. | Scheduling OLTP transactions via learned abort prediction | |
Ren et al. | VLL: a lock manager redesign for main memory database systems | |
Li et al. | ASLM: Adaptive single layer model for learned index | |
Schwalb et al. | Efficient transaction processing for Hyrise in mixed workload environments | |
Basin et al. | KiWi: A key-value map for scalable real-time analytics | |
Sellis et al. | Data intensive production systems: The DIPS approach | |
Jea et al. | Concurrency control in XML document databases: XPath locking protocol | |
Li et al. | Accelerating hybrid transactional/analytical processing using consistent dual-snapshot | |
Arnold et al. | HRDBMS: Combining the best of modern and traditional relational databases | |
Sheng | Non-blocking Lazy Schema Changes in Multi-Version Database Management Systems | |
Jaluta | B-tree concurrency control and recovery in a client-server database management system | |
Rupley Jr | Introduction to query processing and optimization | |
Ragunathan et al. | Speculation-based protocols for improving the performance of read-only transactions | |
Pupezescu et al. | Optimizations of Database Management Systems for Real Time IoT Edge Applications | |
Kumar | A concurrency control mechanism based on extendible hashing for main memory database systems | |
Agrawal et al. | SPEEDITY-A real time commit protocol | |
Ghosh et al. | A new concurrency control mechanism for multi-threaded environment using transactional memory |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120220 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120220 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20140220 Year of fee payment: 5 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
LAPS | Cancellation because of no payment of annual fees |