JP4261609B1 - トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システム - Google Patents

トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システム Download PDF

Info

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
Application number
JP2008120540A
Other languages
English (en)
Other versions
JP2009271665A (ja
Inventor
透 降矢
Original Assignee
透 降矢
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by 透 降矢 filed Critical 透 降矢
Priority to JP2008120540A priority Critical patent/JP4261609B1/ja
Application granted granted Critical
Publication of JP4261609B1 publication Critical patent/JP4261609B1/ja
Priority to US12/453,188 priority patent/US7899799B2/en
Publication of JP2009271665A publication Critical patent/JP2009271665A/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/23Updating
    • G06F16/2308Concurrency control
    • G06F16/2336Pessimistic concurrency control approaches, e.g. locking or multiple versions without time stamps
    • G06F16/2343Locking methods, e.g. distributed locking or locking implementation details
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/23Updating
    • G06F16/2308Concurrency control
    • G06F16/2315Optimistic concurrency control
    • G06F16/2322Optimistic concurrency control using timestamps

Abstract

【課題】
数多くのトランザクションを効率よく同時に処理するために、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムを提案する。
【解決手段】
入力された複数のトランザクションを別々に処理するのではなく、入力された複数のトランザクションが処理を行うデータ項目に対して、そのデータ項目を一度だけ検索し、検索したデータ項目に対して、複数のトランザクションの更新処理を順次メインメモリ内で行い、最後に更新した結果だけをデータベースに一度だけ書き込むことを用いる。
複数の合成トランザクションの処理を同時に並行して実行するために、トランザクションの同時実行制御を備えたマルチオペレーションに、二相ロックを用いたマルチオペレーション・プロセッシングと、タイムスタンプを用いたマルチオペレーション・プロセッシングを用いている。
【選択図】図1

Description

本発明は、データベースのトランザクション同時実行制御に関し、特に、複数のトランザクションが同時に同一のアクセス領域に対して更新処理を行う場合に関するものである。
データベース・マネージメント・システムは、複数のユーザーからネットワークを経由して入力される数多くのトランザクションの処理を同時に並行して実行している。しかし、複数のトランザクションが同時に、同一のデータ項目に対して処理を行うと、データの矛盾が発生する場合があるため、データベース・マネージメント・システムは、データの矛盾が起こらないようにするために、トランザクションの同時実行制御を用いて、複数のトランザクションの処理を行っている。
<直列可能スケジュール>
複数のトランザクションをデータの矛盾が起こることなく処理するにあたって、最も簡単な手法は、トランザクションを1つずつ順番に処理していくことである。この手法は直列スケジュール(serial schedule)と呼び、1つのトランザクション処理が完全に終了してからでないと、次のトランザクションの処理を始めない手法である。しかし、この手法は、複数のトランザクションの処理を同時に平行して行うことができないため、1つのトランザクションがディスクへのI/O処理を完了するまで待っている間、CPU処理を他のトランザクションに切り替えることができないなど、重要なCPU処理時間を無駄にすることになる。
そのため、複数のトランザクションを、データの矛盾が起こることなく、同時に平行して実行するには、直列可能スケジュール(serializable schedule)という手法が用いられる。
直列可能スケジュールを行うには、各トランザクションが処理を行うデータ項目に対してロックをかける手法が用いられる。ロックには、共有ロックと専有ロックがある。共有ロックは、トランザクションがデータを読み取るためだけにかけるロックである。1つのトランザクションがあるデータ項目を読み取るために共有ロックをかけると、他のトランザクションは、そのデータ項目を読み取ることはできるが、更新や削除することは、その共有ロックが解除されるまでできない。専有ロックは、データを更新するときにかけるロックである。1つのトランザクションがあるデータ項目を更新するために専有ロックをかけると、他のトランザクションは、その専有ロックが解除されるまで、そのデータ項目を更新、削除、及び読み取ることはできない。
ただし、ロックを用いただけでは、ロックをかける順番によっては、複数のトランザクション間でデータの矛盾が発生する場合がある。そのため、複数のトランザクションが同一のデータ項目に対してロックをかける場合、ロックをかけた順番に、それらのトランザクションに対して従属グラフを作成する手法が用いられる。従属グラフにサイクルが存在する場合は、複数のトランザクション間でデータの矛盾が発生したことになり、すべてのトランザクションの処理を中断し、中断したトランザクションの処理を再度始めから行うことになる。なお、従属グラフにサイクルが存在しない場合は、すべてのトランザクションの処理が矛盾なく実行されたことになる。
しかし、この手法だと、従属グラフにサイクルが発生する度に、トランザクションの処理が繰り返して中断されるため効率的ではない。また、何度もトランザクションの処理を繰り返しても直列可能スケジュールで行われない場合もある。そのため、直列可能スケジュールを保障するプロトコルとして、二相ロック・プロトコル、楽観的ロック・プロトコル、タイムスタンプ・プロトコル、マルチバージョン・プロトコルなどが用いられる。
(1)二相ロック・プロトコル
二相ロック・プロトコルは、各トランザクションの中のロック操作を、ロックをかける操作だけからなる成長相(growing phase)と、ロックをはずす操作だけからなる縮退相(shrinking phase)の2つの部分に分離して行う。したがって、ロックを解除した後に、再びロックをかけることは許されない。また、成長相ではロックをかける操作以外にロックのアップグレードが許され、縮退相ではロックを解く操作以外にロックのダウングレードが許される。直列可能スケジュールを行うには、すべてのトランザクションが二相ロック・プロトコルに従う必要がある。
二相ロック・プロトコルは、複数のトランザクションがお互いに必要なロックをかけて、どのトランザクションも処理できなくなると、デッドロックが発生することがある。デッドロックをはずすには、ロックをかけているトランザクションの1つを中断してロールバックし、中断したトランザクションをトランザクション同時処理ステムに再提出する。また、中断したトランザクションが書き込んだデータを別のトランザクションが使用していた場合、その別のトランザクションも中断してロールバックすることになる。このように、1つのトランザクションが中断することによって、いくつものトランザクションが連鎖的にロールバックすることを連鎖的ロールバック(cascading rollback)と呼ぶ。連鎖的ロールバックが起こらないようにするには、厳格な二相ロック・プロトコルという手法を用いる。この手法は、二相ロック・プロトコルの縮退相における最初のロックをはずす操作はトランザクションがコミットまたは中断(abort)した後であるという条件をさらに付け加えたものである。この手法を用いると、連鎖的ロールバックは起こらなくなるが、個々のトランザクションがロックをかけておく時間が長くなる。
<二相ロックの問題点>
二相ロック・プロトコルは、同時に処理するトランザクションの数が増えると、複数のトランザクションの間でロックをかけるために競合が起こり、デッドロックが起こりやすくなる。その結果、デットロックをはずすために数多くのトランザクションが中断してロールバックすることになり、トランザクションの処理速度を低下させることになる。
二相ロック・プロトコルは、複数のトランザクションが同時に、同じデータ項目に対して処理を行う必要がある場合、個々のトランザクションごとに、そのデータ項目に対して何度も繰り返してロックをかけることになる。そして1つのトランザクションがあるデータ項目に対してロックをかけている間、そのデータ項目に対して処理を行う他のトランザクションは、そのロックが解除されるまで待たされることになる。
二相ロック・プロトコルは、個々のトランザクションに対して、オペレーティング・システムのプロセスを用いて処理を行っている。1つのトランザクションが、あるデータ項目に対してロックをかけた状態で、オペレーティング・システムによるプロセスの切り替えが起こると、ロックされたそのデータ項目に対して処理を行う他のトランザクションは、CPU(マイクロプロセッサ)で処理される時間を得ても、そのデータ項目に対してロックをかけることができないため、何も処理を行うことができないまま、再びプロセスの切り替えが起こる。同時に処理するトランザクションの数が増えると、このような状態が繰り返して起こるようになり、トランザクションの処理速度を著しく低下させることになる。
(2) 楽観的ロック・プロトコル
楽観的ロック(optimistic locking protocol)は、トランザクションを実行するのに競合がないものと仮定して処理を行い、トランザクションが終了するときに、競合があったかどうかを確認し、競合があったならば、トランザクションを中断してロールバックする。競合がなかったならば、その時点でデータを書き込むデータ項目に対してロックをかけ、書き込み処理を実行し、トランザクションをコミットする。この手法はトランザクションの処理が行われている間、ロックをかけたままの状態にしておく必要がなく、ロックをかけておく時間はトランザクションがコミットする前の短い時間だけですむ。
<楽観的ロック・プロトコルの問題点>
楽観的ロック・プロトコルも二相ロック・プロトコルと同様に、同時に処理するトランザクションの数が増えると、データを更新するために競合するトランザクションの数が増え、中断してロールバックするトランザクションの数も増えるといった問題点がある。
(3) タイムスタンプ・プロトコル
タイムスタンプ・プロトコルは、複数のトランザクションを同時に並行して処理するにあたって、個々のトランザクションにタイムスタンプ(到着時間)を与え、タイムスタンプの小さい(到着時間の早い)トランザクションからタイムスタンプの大きい(到着時間の遅い)トランザクションへと順番に実行していく手法である。そのためには、トランザクションが処理を行う個々のデータ項目に対して、読み込みタイムスタンプと書き込みタイムスタンプを与えて、次の規約に従ってトランザクション処理を行う。
当面のトランザクションが、あるデータ項目に対して読み込む処理を行うとき、当面のトランザクションのタイムスタンプとそのデータ項目の書き込みタイムスタンプを比べ、当面のトランザクションのタイムスタンプの方が小さければ、当面のトランザクションが読み込むべきデータ項目の値がすでに失われているので、当面のトランザクションを中断する。それ以外のときは、当面のトランザクションの処理を実行し、そのデータ項目の読み込みタイムスタンプに、当面のトランザクションのタイムスタンプを与える。
当面のトランザクションが、あるデータ項目に対して書き込み処理を行うとき、当面のトランザクションのタイムスタンプとそのデータ項目の読み込みタイムスタンプを比べ、当面のトランザクションのタイムスタンプの方が小さければ、当面のトランザクションが書き込み処理を行ったあとのデータ項目の値を読み取るべきトランザクションが、先にそのデータ項目を読み取ってしまっているので、当面のトランザクションを中断する。また、当面のトランザクションが、そのデータ項目の読み込みタイムスタンプよりも大きく、そのデータ項目の書き込みタイムスタンプよりも小さければ、当面のトランザクションは、書き込み処理の時機を逸しているので中断する。それ以外のときは、当面のトランザクションを実行し、当面のトランザクションのタイムスタンプの方がそのデータ項目の書き込みタイムスタンプよりも大きければ、そのデータ項目の書き込みタイムスタンプに、当面のトランザクションのタイムスタンプを与える。
なお、中断したトランザクションは、ロールバックし、トランザクション処理システムに再提出し、新たなタイムスタンプが与えられることになる。
タイムスタンプ・プロトコルは、中断されるトランザクションの数を減らすために、トーマスの書き込みルール(Thomas's write rule)という手法を用いることができる。この手法は、トランザクションがあるデータ項目に書き込み処理を行うとき、当面のトランザクションのタイムスタンプが、そのデータ項目の読み込みタイムスタンプよりも大きく、そのデータ項目の書き込みスタンプよりも小さければ、当面のトランザクションは、書き込み処理の時機を逸してしまっているが、そのことによるデータベース及び他のトランザクションへの影響はないので、当面のトランザクションはこの書き込み処理を無視して処理を続ける手法である。
<タイムスタンプ・プロトコルの問題点>
タイムスタンプ・プロトコルはロックを使用しないため、デッドロックが起こることはない。しかし、同時に処理するトランザクションの数が増えると、個々のデータ項目に対して、正しい順番でトランザクションの処理が行われなくなり、数多くのトランザクションが中断してロールバックし、トランザクション処理システムに再提出されることになる。このような処理が繰り返されると、いつまでたってもトランザクションの処理が完了しなくなるといった問題が起こる。
(4) マルチバージョンを用いた手法
マルチバージョンを用いた手法は、当面のトランザクションがあるデータ項目に対して、データを書き込む際に、そのデータ項目の前の値を維持し、1つのデータ項目に対して複数の値を管理する手法である。そして、複数のトランザクションが、同じデータ項目に対して処理を行う場合、個々のトランザクションに対して、適切なバージョンのデータ項目を与えることによって、中断されるトランザクションの数を減らしている。マルチバージョンを用いた手法は、二相ロック・プロトコルにマルチバージョンを適用させた手法と、タイムスタンプ・プロトコルにマルチバージョンを適用させた手法などがある。
<マルチバージョンの問題点>
マルチバージョンの問題点は、個々のデータ項目に対して複数のバージョンを維持するために余分な記憶スペースが必要になることである。
特開平07−084864号公報 特開平07−200372号公報 特開平10−320258号公報 特開2002−32249号公報 United States Patent 5,280,619 January 18, 1994 System for accessing shared data using a serialization graph constructed from a history file showing completed locking dependencies between transactions 北川博之 HIROYUKI KITAGAWA, データベースシステム Database System, pp.147-173, 昭晃堂 情報系教科書シリーズ 第14巻, 1996年7月10日 初版1刷発行 1997 Ramez Elmasri, Shamkant B. Navathe, Fundamentals of Database Systems Second Edition, pp.527-575, Addison-Wesley Publishing Company, 1994 金弘和實 KAZUIMI KANEHIRO, ベテランが丁寧に教えてくれるデータベースの知識と実務, pp.88-105, 株式会社翔泳社, 2007
従来のトランザクション処理システムは、以上に述べた問題点があるため必ずしも効率的な手法ではない。従来の手法は、個々のトランザクションを別々に処理するため、同時に処理するトランザクションの数が増えると、個々のトランザクションごとに、同じデータ項目を何度も繰り返して読み出し、そして書き込むことになり、複数のトランザクションが競合し、中断してロールバックするトランザクションが増えて、トランザクションの処理速度が低下することになる。
本発明では、入力された複数のトランザクションを別々に処理するのではなく、入力された複数のトランザクションが処理を行うデータ項目に対して、そのデータ項目を一度だけ検索し、検索したデータ項目に対して、複数のトランザクションの更新処理を順次メインメモリ内で行い、最後に更新した結果だけをデータベースに一度だけ書き込むことを用いる。
上述の目的を達成するために、本発明は、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムであって、入力された複数のトランザクションに対してトランザクションの実行順を決定するトランザクション実行順決定手段と、前記複数のトランザクションが同一のデータ項目に対して処理を行う場合、そのデータ項目に対する枝を作成し、先に処理を行うトランザクションの接点から次に処理を行うトランザクションの接点にその枝を入力して、前記トランザクションの実行順にデータを更新することを示した先行グラフを作成する先行グラフ作成手段と、前記複数のトランザクションに含まれる部分処理をタスクとして取り出すタスク取手段と、前記取り出したタスクを、前記トランザクションの実行順に、前記データベースのアクセス領域ごとにグループ分けするグループ分け手段と、前記グループ分けして作成したグループを用いて合成トランザクションを作成する合成トランザクション作成手段と、前記合成トランザクションに含まれる個々のグループに対してマルチオペレーション・プロセッシングを用いて処理を行うマルチオペレーション・プロセッシング手段とを備え、前記マルチオペレーション・プロセッシング手段は、グループ分けされたタスクがアクセスするアクセス領域内のブロックを調べ、グループ内のタスクが並んでいる順に該ブロックへのアクセス順を決定し、決定したアクセス順に該ブロックを読み出し、読み出したブロックにアクセスするタスクをグループ内から抽出し、ブロック内のデータ項目に対して、グループ内のタスクが並んでいる順にタスク処理を順次行い、グループ分けされたタスクの処理が終了し、グループ分けされたタスクを包含するトランザクションの処理が終了すると、その時点で終了したトランザクションをコミットするかどうかを、前記先行グラフの終了したトランザクションの接点に入力枝が存在するかどうかで決定し、該トランザクションの接点に入力枝が存在しない場合は、該トランザクションをコミットし、該トランザクションの接点とその接点から出ているすべての枝を削除し、ブロック内のデータ項目に対して、グループ内のタスクが並んでいる順にタスク処理を順次行っていくということは、ブロック内のデータ項目が前記先行グラフに存在する場合、そのデータ項目に対して前記先行グラフに示したトランザクションの実行順にトランザクションの部分処理であるタスクの処理を順次行っていくことであり、複数のタスクがそのデータ項目に対して更新処理を行う場合、そのデータ項目に対して最初のタスクの更新処理を行い、更新されたデータ項目に対して次のタスクの更新処理を行い、このような更新処理を繰り返し、最後のタスクの更新処理が行われると、最後に更新された更新結果だけをデータベースに書き込むことを特徴とする。
また、2相ロック・プロトコル又はタイムスタンプ・プロトコルを用いて複数の合成トランザクションの処理を同時に並行して実行するとよい。
さらに、データベースのトランザクション処理システムの各機能を、コンピュータ・システムに実現させるためのプログラムや、このプログラムを記録した記録媒体も本発明である。
本発明のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いることによって、従来のトランザクションの処理のように、入力された複数のトランザクションに対して、トランザクションごとに同じデータ項目を何度も繰り返して検索し、検索したデータ項目に対して更新処理を別々に行い、更新された結果を何度も繰り返してデータベースに書き込む必要がなくなった。
本発明のシステムでは、複数のトランザクションが処理を行うデータ項目に対して、そのデータ項目を一度だけ検索し、検索したデータ項目に対して、複数のトランザクションの更新処理を順次メインメモリ内で行い、最後に更新した結果だけをデータベースに一度だけ書き込めばよいのでトランザクションの処理速度が向上した。
また、マルチオペレーション・プロセッシングを用いるので、トランザクションの処理を行う個々のデータ項目が格納してあるブロックをディスクから一度だけしか読み出す必要がなくなった。
本発明のシステムは、入力された複数のトランザクションに対して1つの合成トランザクションを作成し、合成トランザクションに含まれる個々のグループの処理は、異なるリレーションに対して行うため、それらのグループの処理を同時に行っても、複数のグループ間で同一のデータ項目がアクセスされることはない。また、グループに集められたタスクの処理は、メインメモリに読み込まれたブロック内のデータ項目に対して、先行グラフに示したトランザクションの実行順に順次行っていく。その結果、合成トランザクションに合成された複数のトランザクションの間でロックなどをかける必要はなく、トランザクションを待たせたり、トランザクションを中断したりするといったことがなくなった。
本発明のシステムは、入力された複数のトランザクションに対して1つの合成トランザクションを作成し、合成トランザクションの処理を行っていくことができ、1つの合成トランザクションの処理が終了した段階で、新たに複数のトランザクションが入力されると、それらのトランザクションに対して別の合成トランザクションを作成し、その合成トランザクションの処理を行っていくことができるので、合成トランザクションの処理を1つずつ実行していく場合には、ロックを用いる必要はなくなる。また、デッドロックなどを発生することもなく、合成トランザクションに含まれる複数のグループの処理を同時に並行して実行していくことができるようになった。
このように合成トランザクションの処理を1つずつ実行していくことによって、複数のトランザクションの処理速度を向上させることができるが、複数の合成トランザクションの処理を同時に並行して実行することが必要となるような場合には、複数の合成トランザクションに二相ロックやタイムスタンプを用いたマルチオペレーション・プロセッシングを使用することによって、CPUやディスクなどのハードウェア資源を効率よく利用することができるようになった。また従来の二相ロック・プロトコルのように、個々のトランザクションがそれぞれロックをかけるのではなく、数多くのトランザクションから作成された合成トランザクションがロックをかけることになるので、オペレーティング・システムのプロセスやロックなどの資源利用の回数を減少させることができるようになった。
本発明は、数多くのトランザクションを効率よく同時に処理するために、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムを提案する。さらに、本発明は、複数の合成トランザクションの処理を同時に並行して実行するために、トランザクションの同時実行制御を備えたマルチオペレーションに、二相ロックを用いたマルチオペレーション・プロセッシングと、タイムスタンプを用いたマルチオペレーション・プロセッシングを提案する。
本発明者は、以前クエリーの処理だけを扱った「マルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム」について提案した(特許4109305号参照)。
本発明のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングが上記のクエリーの処理だけを扱ったマルチオペレーション・プロセッシングと異なる点は、検索処理しか行わないトランザクション(クエリー)の処理以外に、更新処理を行うトランザクションの処理を行うことができるようになったことである。
<データベース・マネージメント・システムの構成>
図1は、本発明のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムのアーキテクチャを示す図である。このアーキテクチャは、マイクロプロセッサ(CPU)、主記憶装置(メインメモリ)、2次記憶装置(ディスク)を備えたコンピュータ・システム105において、トランザクション処理システム100、キュー103、マルチオペレーション・プロセッサ102などのソフトウェアのモジュールから構成されている。
最初に、複数のユーザーからSQLなどの言語で記述された複数のトランザクションT1,T2,…,T8がトランザクション処理システム100に入力されると、トランザクション処理システムは、入力されたトランザクションに対して、トランザクションの部分処理を求めてトランザクションの実行順を決定し、トランザクションの実行順にデータを更新することを示した先行グラフを作成し、トランザクションに含まれる部分処理をタスクとして取り出し、取り出したタスクをデータベースのリレーション(アクセス領域)ごとにグループG1,G2に分けて、グループG1,G2を作成し(トランザクションT1,T2,…,T8が合計2つのリレーションに対して処理を行う必要がある場合)、作成したグループG1,G2を用いて合成トランザクションTG1,G2を作成し、合成トランザクションTG1,G2をキュー103に加える。
キュー103に合成トランザクションTG1,G2が加えられると、マルチオペレーション・プロセッサ102は、キュー103から合成トランザクションTG1,G2を取り出し、オペレーティング・システムのプロセス(104)が5つほどをトランザクション処理システムのために用意されていた場合、プロセス1がTG1,G2に含まれるグループG1に対してマルチオペレーション・プロセッシングを用いて処理を行い、プロセス2がTG1,G2に含まれるグループG2に対してマルチオペレーション・プロセッシングを用いて処理を行うことになる。
次に、合成トランザクションTG1,G2がキューから取り出された後に、新たにトランザクションT9,T10,T11がトランザクション処理システム100に入力されると、トランザクションT9,T10,T11に対しても同様に、トランザクション処理システム100は、入力されたトランザクションに対して、トランザクションの部分処理を求めてトランザクションの実行順を決定し、トランザクションの実行順にデータを更新することを示した先行グラフを作成し、トランザクションに含まれる部分処理をタスクとして取り出し、取り出したタスクをデータベースのリレーションごとにグループG3,G4,G5に分けて、グループG3,G4,G5を作成し(トランザクションT9,T10,T11が合計3つのリレーションに対して処理を行う必要がある場合)、作成したグループG3,G4,G5を用いて合成トランザクションTG3,G4,G5を作成し、合成トランザクションTG3,G4,G5をキュー103に加える。
マルチオペレーション・プロセッサ102は、現在プロセス1とプロセス2を用いて合成トランザクションTG1,G2の処理を行っていたとすると、残ったプロセス3とプロセス4とプロセス5を用いて合成トランザクションTG3,G4,G5のグループG3,G4,G5の処理を行うことになる。
<マルチオペレーション・プロセッシングを用いたトランザクション処理システムのフローチャート>
図2−1,図2−2は、図1で説明したトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムにおいて、トランザクションを処理する一連の流れの概略を説明するためのフローチャートである。
最初に、図2−1において、複数のユーザーからSQL(構造化問い合わせ言語)などのリレーショナル・データベースの言語で記述された複数のトランザクションT1,T2,T3,….,Tsがデータベース・サーバーのトランザクション処理システム100に入力される(S200)。
トランザクション処理システム100は、入力されたトランザクションに対して、実行可能なオペレーションに変換してトランザクションの部分処理を作成する(S201)。トランザクションの部分処理を作成すると、トランザクションの実行順を決定する(S202)。
トランザクションの実行順を決定すると、トランザクションT1,T2,….,Tsを接点とした先行グラフを作成する(S203)。先行グラフを作成するにあたって、トランザクションT1,T2,…,Tsの中で複数のトランザクションが同一のデータ項目に対して処理を行う場合、そのデータ項目に対して矢印を持った枝を作成し、先に処理を行うトランザクションの接点から次に処理を行うトランザクションの接点へとその枝を入力させて、そのデータ項目に対するトランザクションの実行順を明確にする。
先行グラフを作成すると、トランザクションに含まれる部分処理をタスクとして取り出し、取り出したタスクをデータベースのリレーション(アクセス領域)ごとにグループ分けして、グループG1,G2,…,Gnを作成する(S204)。
作成されたグループG1,G2,…,Gnを用いて合成トランザクションTG1,G2,…,Gnを作成する(S205)。
合成トランザクションTG1,G2,…,Gnに含まれる個々のグループGi(i=1,2,..,n)に対して、マルチオペレーション・プロセッサ102を用いてグループの処理を開始する(S206)。
マルチオペレーション・プロセッッサ102は、グループ内のタスクがアクセスするブロックを調べてブロック集合に集める(S207)。
ブロック集合にブロックを集めると、グループ内のタスクが並んだ順にブロックへのアクセス順を決定する(S208)。
決定したブロックのアクセス順にブロックを読み出し、読み出したブロックにアクセスするタスクをグループから抽出し、ブロック内のデータ項目に対して、グループ内のタスクが並んだ順にタスク処理を順次行っていく(S209)。
ブロックでタスクの処理が終了すると(図2−2:S210)、終了したタスクを包含するトランザクションの処理が終了したかどうかを調べる(S211)。トランザクションの処理が終了したかどうかは、トランザクションに含まれるすべてのタスクの処理が終了したかどうかで調べることになる。トランザクションの処理が終了しない場合は、ブロックのアクセス順に示したすべてのブロックをアクセスしたがどうかを確認する(S217)。
トランザクションの処理が終了した場合は、先行グラフをもとにして、この時点でトランザクションをコミットすることができるかどうかを決定する(S212)。トランザクションをコミットすることができるかどうかは、先行グラフにおいて、終了したトランザクションの接点に入力枝が存在するかどうかで調べることになる。
終了したトランザクションの接点に入力枝が存在し、この時点でトランザクションをコミットできない場合は、そのトランザクションをコミット待ちのトランザクションとして置いておく(S216)。
入力枝が存在しないで、トランザクションをコミットすることができる場合は、トランザクションをコミットし(S213)、そのトランザクションの接点とその接点から出ているすべての枝を先行グラフから削除する(S214)。また、枝を削除することによって、別のコミット待ちのトランザクションの接点に入力している枝がすべて無くなる場合は(S215)、そのトランザクションもコミットし、連鎖的にトランザクションのコミットを繰り返していく(S213)。
アクセスしたブロックでの処理が終了すると、ブロックのアクセス順に示したすべてのブロックをアクセスし終えたかどうかを確認する(S217)。
まだ、アクセスしてないブロックが残っているならば、ブロックのアクセス順に、次にアクセスするブロックをディスクから読み出し、読み出したブロックにアクセスするタスクをグループから抽出し、読み出したブロック内のデータ項目に対して、トランザクションの実行順にトランザクションの部分処理であるタスク処理を繰り返して行っていく(S209)。
ブロックのアクセス順に示したすべてのブロックをアクセスし終えると、グループの処理が終了する(S218)。グループの処理が終了すると合成トランザクションに含まれるすべてのグループの処理が終了したかどうかを確認する(S219)。
まだ、グループが残っている場合は、次に処理するグループを合成トランザクションから取り出し、取り出したグループに対して、マルチオペレーション・プロセッシングを用いて処理を行い、このようにしてグループの処理を繰り返して行っていく(S206)。
合成トランザクションに含まれるすべてのグループ処理を終えると、合成トランザクションの処理が完了し、入力されたすべてのトランザクションT1,T2,T3,…,Tsの処理が終了してコミットしたことになる(S220)。
図1,図2−1,図2−2において、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングの概略を説明した。
以下の章において、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムについて詳しく説明していくことにする。
第1章では、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたトランザクション処理の手順、及び具体例を示している。第2章では、複数の合成トランザクションを同時に並行して実行するために、二相ロックを用いたマルチオペレーション・プロセッシングとタイムスタンプを用いたマルチオペレーション・プロセッシングを提案し、それぞれの手法を用いた複数の合成トランザクションの処理を並行して行うための手順、及び具体例を示している。第3章では、結合演算の処理を行うクエリーなど、複雑で高度なクエリーがトランザクションに含まれている場合のマルチオペレーション・プロセッシングを具体例をもとに説明している。
第4章では、従来のトランザクションの処理である二相ロック・プロトコルと、本発明のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングとの処理速度を比較するために、独自に開発したデータベース・マネージメント・システムのソフトウェアMOP-DBを用いて、それぞれの処理を用いた実験結果を示している。
[1. トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシング]
[1.1トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングの手順]
[(1) トランザクションの部分処理の作成(S201)]
データベース・マネージメント・システムに、複数のトランザクションT1,T2,T3,…,Tsが入力される(S200)と、個々のトランザクションに対して、トランザクションが行うレコードrの読み取り処理をread_item(r)とし、レコードrの書き込み処理をwrite_item(r)として表わしたトランザクションの部分処理を作成する(S201)。
[(2) トランザクションの実行順の決定(S202)]
トランザクションの部分処理を求めると、入力された複数のトランザクションT1,T2,T3,…,Tsに対して、トランザクションの実行順を決定する(S202)。トランザクションの実行順を決定するには、トランザクションの部分処理をもとにしてトランザクションの処理コストを求め、処理コストの小さいトランザクションから処理コストの大きいトランザクションへとトランザクションを並べてトランザクションの実行順を決定する。
なお、トランザクションの処理コストよりも、トランザクションの到着時間の方が重要である場合は、トランザクションの到着順をトランザクションの実行順にしてもよい。
[(3) 先行グラフの作成(S203)]
トランザクションの実行順を決定すると、トランザクションT1,T2,T3,…,Tsを接点とした先行グラフを作成する(S203)。先行グラフを作成するにあたって、トランザクションT1,T2,T3,…,Tsの中で、複数のトランザクションが同一のデータ項目に対して処理を行う場合、そのデータ項目に対して矢印を持った枝を作成し、トランザクションの実行順に、先に処理を行うトランザクションの接点から、次に処理を行うトランザクションの接点へと、その枝を入力する。
トランザクションの実行順が、トランザクションの処理コストの小さい順で並べられている場合は、処理コストの小さいトランザクションの接点から処理コストの大きいトランザクションの接点へと、枝を入力することになる。また、トランザクションの実行順が、トランザクションの到着順で並べられている場合は、先に到着したトランザクションの接点から次に到着したトランザクションの接点へと枝を入力することになる。
[(4) タスクのグループ分け(S204)]
トランザクションT1,T2,T3,…,Tsに含まれる個々の更新処理、及び検索処理などの部分処理をタスクti j(i=トランザクションの番号、j=トランザクション内の処理番号)として取り出し、取り出したタスクを、トランザクションの実行順にデータベースのリレーション(アクセス領域)ごとにグループG1,G2,…,Gnとしてグループに分けていく(S204)。リレーションはデータベースのアクセス領域である。
[(5) 合成トランザクションの作成(S205)]
タスクがリレーションごとにグループ分けされると、作成されたグループG1,G2,…Gnを用いて合成トランザクショTG1,G2,…Gnを作成する(S205)。合成トランザクションTG1,G2,…Gnの処理を行うには、マルチオペレーション・プロセッシングを用いて合成トランザクションTG1,G2,…Gnに含まれる個々のグループ処理を順次行っていくことになる。
[(6) マルチオペレーション・プロセッシングによるグループ処理]
最初に、合成トランザクションTG1,G2,…GnからグループG1を取り出し、マルチオペレーション・プロセッシングを用いてグループG1の処理を開始する(S206)。
[(7) タスクのアクセス領域の検出]
グループ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}となるブロック集合を見出す。ここでブロック集合を見出すにあたっては、インデックスによるブロックの格納位置を調べるだけであって、リレーション内のブロックをディスクにアクセスしてブロックの格納位置を調べることではない。
[(8) ブロックのアクセス順位の決定(S208)]
グループG1内のタスクt1, t2, t3,…,tpに対応するブロック集合B1,B2,B3,…Bpを見出すと、ブロック集合B1,B2,B3,…,Bpの和集合を求めていく。最初に、タスクt1とタスクt2に対応するブロック集合との和集合を求め、その和集合とタスクt3に対応するブロック集合との和集合を求めるということを順次行い、最後にタスクtpに対応するブロック集合との和集合を求める。この際、順次和集合に加わるブロックは和集合中のブロックの後に加えるものとする。最後に求めた和集合の結果から、トランザクションの実行順に、トランザクションの部分処理であるタスク処理を行っていくにあたって、最初にリレーション内のどのブロックからアクセスを始めて、最後にどのブロックでアクセスを終えるかのブロックのアクセス順位を決定することができる(S208)。また、このようにして和集合を求めることは、グループ内のタスクを処理するにあたって、リレーション内のブロックを何度もディスクにアクセスして読み出すことなしに、一度だけブロックにアクセスすれば済むようにするためである。
[(9) 各ブロックでのタスク処理(S209)]
[ブロック 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)。
その際、削除した枝がコミット待ちのトランザクションの接点に入力している枝であり、その枝を削除することによって、コミット待ちのトランザクションの接点に入力している枝が1つもなくなる場合(S215:YES)は、そのコミット待ちのトランザクションもコミットすることになる(S213)。その理由は、接点に入力している枝がなくなるということは、同じデータ項目に対して先に書き込み処理を行ったトランザクションがコミットしたため、その書き込まれたデータ項目を読み込んだ別のトランザクションもコミットすることができるからである。
[ブロック bkでのタスク処理]
さて、すべてのブロックをアクセスしていない場合(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内のすべてのタスクの処理を終了する(S217:YES)。
[(10) マルチオペレーション・プロセッシングによるグループG2,…,Gnの処理]
グループG1の処理が終了する(S218)と、合成トランザクションTG1,G2,…,GnからグループG2,…,グループGnを順次取り出し、グループG1と同じ手順を用いてグループ処理を繰り返して行っていく(S219:NO)。
すべてのグループ処理を終える(S219:YES)と、合成トランザクションTG1,G2,…,Gnの処理が完了し、入力されたすべてのトランザクションT1,T2,T3,…,Tsの処理が終了してコミットしたことになる(S220)。
[1.2. トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングの具体例]
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)は、各レコードに対してインデックスのポインタを持っている。
図3−2は、固定長レコードを使用して作成したデータベースのリレーションEMPLOYEE(従業員)である。EMPLOYEE(400)には20件のレコードが5つのブロックに格納してあり、それぞれのブロックに4つのレコードが存在する。各レコードには、SSN(従業員番号),FNAME(名),MINIT(ミドルネームの頭文字),LNAME(姓),BDATE(生年月日), DNUM(部門番号), PHONE(電話番号)のデータが格納されている。各ブロックは、次のブロックに対してブロックポインタを持っている。主キーSSNには、主インデックス(410)が存在し、主インデックス(410)は、各ブロックに対してインデックスポインタを持っている。また属性PHONEには2次インデックス(420)が存在し、2次インデックス(420)は、各レコードに対してインデックスのポインタを持っている。
なお、図3−1のリレーションDEPARTMENT(300)と図3−2のリレーションEMPLOYEE(400)以外に、図では示していない1つのリレーションPROJECTがデータベースに存在するものとする。
リレーションDEPARTMENT(300), EMPLOYEE(400), PROJECTは、リレーショナル・データベース・システムのアクセス領域であり、リレーション内のブロックはデータベースのデータが格納してあるディスク上のアクセス単位である。
次に、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたトランザクション処理を説明するために、これらのリレーションに対して、下記に示すようなトランザクションT1, T2, T3, T4, T5, T6, T7, T8の処理を取り上げることにする。以下において、各トランザクションは、BEGINで開始し、COMMITで完了することにする。
(T1):BEGIN WORK;
-- 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):BEGIN 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):BEGIN 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):BEGIN 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):BEGIN 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):BEGIN 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):BEGIN WORK;
-- T7の更新処理1
UPDATE EMPLOYEE
SET BDATE = 'DEC-27-1971'
WHERE SSN = 1645455566;
COMMIT WORK;
(T8):BEGIN WORK;
-- T8の更新処理1
UPDATE EMPLOYEE
SET DNUM = 7
WHERE PHONE = 21-3728 OR SSN = 2066567788;
COMMIT WORK;
[(1) トランザクションの部分処理の作成(S201)]
入力されたトランザクション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):
(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):
(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):
(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):
(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):
(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):
(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):
(t7 1):read_item(E.r6);
E.r6.BDATE := 'DEC-27-1971';
write_item(E.r6);
(T8):
(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);
[(3) トランザクションの実行順の決定(S202)]
トランザクションの部分処理を求めると、トランザクションT1, T2, T3, T4, T5, T6, T7, T8に対して、トランザクションの実行順を決定することになる。
トランザクションの実行順を決定するには、トランザクションに含まれる部分処理をもとにしてトランザクションの処理コストを求め、トランザクションの処理コストの小さい順にトランザクションを並べてトランザクションの実行順を決定するとよい。そのため、トランザクションの部分処理をもとにしてトランザクションの処理コストをもとめると次のようになる。
Figure 0004261609
トランザクションの処理コストは、トランザクションの処理に必要とされるブロックのアクセス回数である。例えば、トランザクションT1はリレーションDEPARTMENTのブロックb2に格納してあるレコードr7とr9と、リレーションEMPLOYEEのブロックb4に格納してあるレコードr14と、2つのブロックをアクセスする必要があるので、処理コストを2とする。
トランザクションの処理コストを求めると、次のようにして処理コストの小さい順にトランザクションを並べてトランザクションの実行順を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)
[(4) 先行グラフの作成(S203)]
トランザクションの実行順を決定すると、トランザクションT2, T7, T1, T3, T5, T8, T4, T6を接点とした図4(a)に示す先行グラフを作成する。先行グラフを作成するにあたって、トランザクションT2, T7, T3, T1, T5, T8, T4, T6の中で複数のトランザクションが同一のデータ項目に対して処理を行う場合、そのデータ項目に対して矢印を持った枝を作成し、トランザクションの実行順に先に処理を行うトランザクションの接点から次に処理を行うトランザクションの接点へとその枝を入力させて、同一のデータ項目に対するトランザクションの実行順を示しておく。なお、1つのトランザクションだけで処理されるデータ項目は先行グラフに枝を記入しないことにする。
トランザクションT4, T6は、リレーションDEPARTMENT内の同一のレコードD.r3に対して更新処理を行うため、トランザクションの実行順に、接点T4から接点T6へと枝を入力させる。
トランザクションT2,T1,T5は、リレーションDEPARTMENT内の同一のレコードD.r7に対して更新処理を行うため、トランザクションの実行順に、接点T2から接点T1へと枝を入力させ、接点T1から接点T5へと枝を入力させる。
トランザクションT2,T5は、リレーションDEPARTMENT内の同一のレコードD.r8に対して更新処理を行うため、トランザクションの実行順に、接点T2から接点T5へと枝を入力させる。
トランザクションT5,T6は、リレーションDEPARTMENT内の同一のレコードD.r14に対して更新処理を行うため、トランザクションの実行順に、接点T5から接点T6へと枝を入力させる。
トランザクションT3,T4は、リレーションDEPARTMENT内の同一のレコードD.r19に対して更新処理を行うため、トランザクションの実行順に、接点T3から接点T4へと枝を入力させる。
トランザクションT7,T8は、リレーションEMPLOYEE内の同一のレコードE.r6に対して更新処理を行うため、トランザクションの実行順に、接点T7から接点T8へと枝を入力させる。
トランザクションT8,T4は、リレーションEMPLOYEE内の同一のレコードE.r10に対して更新処理を行うため、トランザクションの実行順に、接点T8から接点T4へと枝を入力させる。
なお、図4(a)に示す先行グラフは、トランザクションの実行順にもとづいて作成されるため、サイクルを含んでおらず、この先行グラフをもとにして行われるトランザクションのスケジュールは、直列可能スケジュールである。
[(5) タスクのグループ化(S204)]
トランザクション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に対して処理を行うタスクを集めることになる。
[(6) 合成トランザクションTG1,G2の作成(S205)及び処理(S206)]
タスクをグループ分けして、グループG1,G2を作成すると、グループG1,G2を用いて合成トランザクションTG1,G2を作成する。合成トランザクションTG1,G2の処理を行うには、合成トランザクションTG1,G2に含まれるグループG1, G2に対して、それぞれマルチオペレーション・プロセッシングを用いて処理することになる。
[(6-1) グループG1の処理]
[(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 1に対して、B2 1 = {b2}
タスク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}
[(b) ブロックのアクセス順位の決定(S208)]
グループ内の個々のタスクに対応するブロック集合を見出すと、グループにタスクが並べられた順に、すなわち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を順次求めると次のようになる。この場合、順次和集合に加わるブロックは和集合中のブロックの後に加えていくものとする。
TB0 ← {}(空集合)
ブロック集合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}
以上のように、各タスクに対応するブロック集合に対して、タスクが並べられた順に、順次和集合を求めていくと、最後の和集合TB6 3から、ブロックb2からブロックのアクセスを開始し、ブロックb5でアクセスを終了すればよいことになり、リレーションDEPARTMENT(300)内のブロックへのアクセス順は(b2, b4, b3, b1, b5)となる。このような手法で和集合を求めることによって、リレーションDEPARTMENT(300)内のブロックへのアクセス順を決定することができ、この順にブロックを読み出し、読み出したブロックにアクセスするタスクをグループ内から抽出して実行していくことになる。
[(c) 各ブロックでのタスク処理(S209)]
[(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 1に対して: B2 1 ∩ {b2} = {b2}
タスク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に対して積集合が{b2}となり、ブロックb2で処理が可能となり、メインメモリに読み込んだブロック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の処理を行うにあたっては、ブロック内のレコード順位が小さいレコードから順番に処理していき、個々のレコードに対しては、タスクt2 1, t2 2, t1 1, t1 2, t3 1, t5 1の順番でタスク処理を行っていくことになり、それらの処理は次のような順番になる。
Figure 0004261609
レコードD.r6に関しては、タスクt3 1がレコードD.r6に対して更新処理を行う。
レコード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による最後の更新結果のみをデータベースに一度だけ書き込むことになる。
レコードD.r9に関しては、タスクt1 2がレコードD.r9に対して更新処理を行う。
ブロック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) = {}
この結果、ブロック集合B2 1(1), B2 2(1), B1 1(1), B1 2(1), B5 1 (1) が空集合({})になり、タスクt2 1, t2 2, t1 1, t1 2,t5 1の処理が終了する。すると、トランザクションT2内のすべてのタスクの処理が終了するので、この時点でトランザクションT2をコミットできるかどうかを、図4(a)の先行グラフをもとにして決定する。接点T2には、他のどの接点からも入力している枝がないので、トランザクションT2をコミットすることになる。T2をコミットすると、図4(a)の先行グラフから接点T2と接点T2から出力しているすべての枝を削除し、その結果を図4(b)の先行グラフとして表わすことができる。
また、トランザクションT1,T5によるレコードD.r7に対する更新処理は終了したけれども、T1,T5はまだコミットしていないため、図4(b)の先行グラフ内の接点T1から接点T5へと入力しているD.r7の枝を点線の枝として残しておくことにする。
[(c-2) ブロックb4にアクセス]
次に、リレーション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 1に対して: B3 1(1) ∩ {b4} = {b4}
タスク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 1, t3 2, t4 2に対して積集合が{b4}となり、ブロックb4で処理が可能となり、メインメモリに読み込んだブロックb4でタスクt3 1, t3 2, t4 2の処理を行うと次のようになる。
Figure 0004261609
レコードD.r19に関しては、図4(b)の先行グラフに示すトランザクションT3, T4の実行順に、それらのトランザクションの部分処理であるタスクt3 1, t4 2の更新処理を順次行っていく。
タスクt3 1は、データベースから読み込んだレコードD.r19に対して更新処理を行い、タスクt4 2は、タスクt3 1が更新したレコードD.r19に対して更新処理を行うことになる。このようにタスクt3 1, t4 2による更新処理をメインメモリ内で順次行い、タスクt4 2による最後の更新結果のみをデータベースに一度だけ書き込むことになる。
タスクt3 2の検索処理は、レコードD.r19を検索することである。そのためメインメモリに読み込まれたレコードD.r19に対して、タスクt3 2と同じトランザクションT3に含まれるタスクt3 1の更新処理が先に行われると、タスクt4 2の更新処理が行われる前に、タスクt3 1によるレコードD.r19の更新結果を、タスクt3 2の検索結果として取り出すことになる。
ブロックb4でのタスクt3 1, t3 2, t4 2の処理が終了すると、ブロックb4を再びアクセスする必要がなくなるので、集合B3 1(1), B3 2, B4 2と集合{b4}との差集合を求めて、得られた差集合をB3 1(2), B3 2(1), B4 2(1)とすると、次のようになる。
タスク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)の先行グラフとして表わすことができる。
[(c-3) ブロックb3の読み込み]
次に、リレーション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との間でそれぞれ積集合(∩) を求めると次のようになる。
タスクt5 2に対して: B5 2 ∩ {b3} = {b3}
タスクt4 1に対して: B4 1 ∩ {b3} = {}
タスクt6 1に対して: B6 1 ∩ {b3} = {b3}
タスクt6 2に対して: B6 2 ∩ {b3} = {}
タスクt6 3に対して: B6 3 ∩ {b3} = {}
タスクt5 2, t6 1に対して積集合が{b3}となり、ブロックb3で処理が可能となり、メインメモリに読み込んだブロックb3でタスクt5 2, t6 1の処理を行うと次のようになる。
Figure 0004261609
レコードD.r14に関しては、図4(c)の先行グラフに示すトランザクションT5, T6の実行順に、それらのトランザクションの部分処理であるタスクt5 2, t6 1の更新処理を順次行っていく。
タスク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 2の処理が終了すると、トランザクションT5に含まれるすべてのタスクの処理が終了することになり、この時点でトランザクションT5をコミットできるかどうかを、図4(c)の先行グラフをもとにして決定する。トランザクションT5は、トランザクションT1が先に処理を行ったレコードD.r7に対して処理を行っていて、トランザクションT1はまだコミットしていないため、トランザクションT5をコミットすることはできない。そのためT5をコミット待ちのトランザクションとして置いておくことになる。図4(d)の先行グラフは、トランザクションT5の処理は終了したけれども、コミットできない状態を点線の接点T5として表わしている。
また、トランザクションT5,T6によるレコードD.r14に対する更新処理は終了したけれども、T5,T6はまだコミットしていないため、図4(d)の先行グラフ内の接点T5から接点T6へと入力しているD.r14の枝を点線の枝として残しておくことにする。
[(c-4) ブロックb1にアクセス]
次に、リレーション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, t6 1に対して積集合が{b1}となり、ブロックb1で処理が可能となり、メインメモリに読み込んだブロックb1でタスクt4 1, t6 1の処理を行うと次のようになる。
Figure 0004261609
レコードD.r3に関しては、図4(d)の先行グラフに示すように、トランザクションT4,T6の実行順に、それらのトランザクションの部分処理であるタスクt4 1,t6 1の更新処理を順次行っていく。タスクt4 1は、データベースから読み込んだレコードD.r3に対して更新処理を行い、タスクt6 1は、タスクt4 1が更新したレコードD.r3に対して更新処理を行うことになる。このようにタスクt4 1,t6 1による更新処理をメインメモリ内で順次行い、タスクt6 1による最後の更新結果のみをデータベースに一度だけ書き込むことになる。
ブロックb1でのタスクt4 1,t6 1の処理が終了すると、ブロックb1を再びアクセスする必要がなくなるので、ブロック集合B4 1, B6 1(1)と集合{b1}との差集合を求めて、得られた差集合をB4 1(1), B6 1(2)とすると、次のようになる。
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の枝を点線の枝として残していることを表わしている。
[(c-5) ブロックb5の読み込み]
最後に、リレーションDEPARTMENT内のブロックの格納位置が1024であるブロックb5内のデータをディスクからメインメモリに読み込み、ブロックb5でグループG1内の最後のタスクt6 2,t6 3の処理を行うと次のようになる。
Figure 0004261609
タスクt6 2は、データベースから読み込んだレコードD.r22に対して更新処理を行う。
タスクt6 3は、データベースから読み込んだレコードD.r23を取り出して検索することになる。
タスクt6 2, t6 3の処理が終了すると、トランザクションT6内のすべてのタスクの処理が終了するので、この時点でトランザクションT6をコミットできるかどうかを、図4(e)の先行グラフをもとにして決定する。トランザクションT6は、トランザクションT5が先に処理を行ったレコードD.r14に対して処理を行い、トランザクションT4が先に処理を行ったレコードD.r3に対して処理を行っているが、トランザクションT5,T4はまだコミットしていないので、トランザクションT6をコミットすることはできない。したがって、トランザクションT6はコミット待ちのトランザクションとして置いておくことになる。図4(f)の先行グラフは、トランザクションT6の処理は終了したけれども、コミットできない状態を点線の接点T6として表わしている。
タスクt6 2, t6 3の処理が終了すると、グループG1内のすべてのタスクの処理が終了することになる。グループG1の処理が終了すると、合成トランザクションに含まれるグループG2の処理を開始することになる。
[(6-2) グループG2の処理]
リレーションEMPLOYEEに対するグループG2の処理は、グループG1の処理と同様に、グループG2内のタスクに対してマルチオペレーション・プロセッシングを用いて処理することになる。
[(a) タスクがアクセスするブロックの集合]
図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}
[(b) ブロックのアクセス順位の決定]
ブロック集合を見出すと、グループ内のタスクが並べられた順に、すなわち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) 各ブロックでのタスク処理]
[(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, t8 1に対して積集合が{b2}となり、ブロックb2で処理が可能となり、メインメモリに読み込んだブロックb2でタスクt7 1, t8 1の処理を行うと次のようになる。
Figure 0004261609
レコードE.r6に関しては、図4(f)の先行グラフに示すように、レコードE.r6に対して、トランザクションT7,T8の実行順に、それらのトランザクションの部分処理であるタスクt7 1,t8 1の更新処理を順次行っていく。タスクt7 1は、データベースから読み込んだレコードE.r6に対して更新処理を行い、タスクt8 1は、タスクt7 1が更新したレコードE.r6に対して更新処理を行うことになる。このようにタスクt7 1,t8 1による更新処理をメインメモリ内で順次行い、タスクt8 1による最後の更新結果のみをデータベースに一度だけ書き込むことになる。
ブロックb2でのタスクt7 1, t8 1の処理が終了すると、ブロックb2を再びアクセスする必要がなくなるので、ブロック集合B7 1, B8 1と集合{b2}との差集合を求めて、得られた差集合をB7 1(1), B8 1(1)とすると、次のようになる。
タスク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)の先行グラフとして表わすことができる。
[(c-2) ブロックb4の読み込み]
次に、リレーション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の更新処理を行うと次のようになる。
Figure 0004261609
ブロックb4でのタスクt1 3の処理が終了すると、ブロックb4を再びアクセスする必要がなくなるので、ブロック集合B1 3と集合{b4}との差集合を求めて、得られた差集合をB1 3(1)とすると、次のようになる。
タスク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)の先行グラフとして表わすことができる。
[(c-3) ブロックb3にアクセス]
最後に、リレーションEMPLOYEE内のブロックの格納位置が512であるブロックb3内のデータをディスクからメインメモリに読み込み、ブロックb3でグループG2内に残ったタスクt8 1,t4 3の処理を行うと次のようになる。
Figure 0004261609
レコードE.r10に関しては、図4(h)の先行グラフに示すように、レコードE.r10に対して、トランザクションT8,T4の実行順に、それらのトランザクションの部分処理であるタスクt8 1,t4 3の更新処理を順次行っていく。タスクt8 1は、データベースから読み込んだレコードE.r10に対して更新処理を行い、タスクt4 3は、タスクt8 1が更新したレコードE.r10に対して更新処理を行うことになる。このようにタスクt8 1,t4 3による更新処理はメインメモリ内で順次行い、タスクt4 3による最後の更新結果のみをデータベースに一度だけ書き込むことになる。
タスクt8 1,t4 3の処理が終了すると、トランザクションT8,T4のすべてのタスクが終了し、この時点で入力枝のないトランザクションT8をコミットすることができ、さらにトランザクションT4もコミットすることができので、図4(h)の先行グラフから接点T8, T4を削除する。そうすると、接点T4から接点T6へと伸びる枝も削除され、接点T6の入力枝がすべてなくなる(図4(i)参照)ため、トランザクションT6もコミットすることになる。その結果、入力されたすべてのトランザクションがT2, T3, T7, T1, T5, T8, T4, T6の順番でコミットしたことになる。
以上のことをまとめると表10のようになる。グループG1の処理を行うには、リレーションDEPARMENT(300)に対して、ブロックb2でタスクt2 1, t2 2, t1 1, t1 2, t3 1, t5 1の処理を行ってトランザクションT2の処理が終了してコミットし、ブロックb4でタスクt3 1, t3 2, t4 2の処理を行ってトランザクションT3の処理が終了してコミットし、ブロックb3でタスクt5 2, t6 1の処理を行ってトランザクションT5の処理が終了し、ブロックb1ではタスクt4 1,t6 1の処理を行い、ブロックb5でタスクt6 2,t6 3の処理を行ってトランザクションT6の処理が終了する。
グループ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がコミットする。
Figure 0004261609
このようにして、入力された複数のトランザクションの処理が同時に行われ、T2, T3, T7, T1, T5, T8, T4, T6の順にトランザクションが終了してコミットすることになる。トランザクションがコミットした順は、最初に決定したトランザクションの実行順と若干異なるけれども、どちらの順もサイクルを含んでいない図4(a)の先行グラフをトポロジカルソートして得ることができる順なので、この手法は、トランザクションの実行順と競合等価な直列可能スケジュールである。
以上のように、同時に処理することのできる複数のトランザクションに対して、トランザクションの実行順を決定し、決定した順にデータを更新することを示した先行グラフを作成し、トランザクションに含まれる部分処理をタスクとして取り出し、取り出したタスクを、トランザクションの実行順に、データベースのリレーションごとにグループ分けし、グループ分けして作成したグループを用いて合成トランザクションを作成し、合成トランザクションに含まれる個々のグループに対してマルチオペレーション・プロセッシングを用いて処理を行っていくのがトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングによるデータベースのトランザクション処理システムである。
上記の具体例では、複数のトランザクションによって処理されるレコードをデータ項目として扱って説明した。レコードをデータ項目として扱うと、数多くのレコードが処理される場合、個々のレコードの格納位置を調べて、膨大な先行グラフを作成することになる。そのため、レコードが格納してあるブロックの格納位置だけを調べて、ブロックをデータ項目として扱い、ブロックに対して先行グラフを作成してもよい。その場合、アクセスしたブロックが先行グラフに存在するときに、そのブロックに対して、グループ内のタスク処理を順次行っていくことになる。
また、上記の具体例では、readとwriteを基本とするトランザクションの更新処理を扱った。実際の更新処理には、データの挿入や削除も行われる。マルチオペレーション・プロセッシングを用いてデータの挿入を行うには、データを挿入するブロックの格納位置を調べて、そのブロックに十分なスペースがある場合は、ブロックのアクセス順にしたがってそのブロックをアクセスした際に、データを挿入することになる。また、マルチオペレーション・プロセッシングを用いてデータの削除を行うには、データを削除するブロックの格納位置を調べて、ブロックのアクセス順にしたがってそのブロックをアクセスした際に、データを削除することになる。
合成トランザクションに含まれる個々のグループの処理は、異なるリレーションに対して行われるため、それらのグループの処理を同時に行っても、グループ間で同一のデータ項目がアクセスされることはない。また、グループに集められたトランザクションの部分処理であるタスクの処理は、メインメモリに読み込まれたブロック内のデータ項目に対して、先行グラフに示したトランザクションの実行順に順次実行していくので、合成トランザクションに合成された個々のトランザクションの間でロックをかける必要はない。したがってトランザクションが待たされたり、トランザクションが中断されたりするといった問題は起こらない。
本発明のトランザクション同時実行制御を備えたマルチオペレーション・プロセッシングにおいては、数多くのトランザクションが入力されると、1.1節で述べた手順にしたがって合成トランザクションを作成し、合成トランザクションの処理を行っていくことができ、1つの合成トランザクションの処理が終了した段階で、新たに数多くのトランザクションが入力されると、同様な手順を用いて別の合成トランザクションを作成し、その合成トランザクションの処理を行っていくことができるので、合成トランザクションの処理を順次1つずつ実行していく場合には、ロックを用いる必要性はなくなる。また、デッドロックなどを発生することもなく、合成トランザクションに含まれる複数のグループの処理を同時に並行して実行していくことができる。
このような処理で複数のトランザクションの処理速度を十分に向上させることができるが、図1のオペレーティング・システムのプロセス(104) によるCPUとディスクの資源(105)を効率よく利用するには、複数の合成トランザクションを同時に処理したほうが、効率がいい場合があるので、第2章では複数の合成トランザクションの処理を同時に実行していくためのシステムを提案する。
[2. 複数の合成トランザクションの処理]
合成トランザクションの処理を行っている間に、新たに別のトランザクションがいくつか到着すると、到着した複数のトランザクションに対して合成トランザクションが作成され、現在処理が行われている合成トランザクションと一緒に処理が行われると、複数の合成トランザクションの間でデータの矛盾が起こる可能性が出てくる。
例えば、合成トランザクション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と表わすことにする。
図5−1及び図5−2では、合成トランザクションTG1,G2は、時間経過とともに、レコードD.r6,D.r7,D.r8,D.r9,D.19,D.r14,D.r3,D.22,D.23,E.r6,E.r14, E.r10の順にロックをかけて、すべてのロックをかけた後に、マルチオペレーション・プロセッシングによるレコードの処理が終了したレコードから順番にロックをはずしていることが示されている。
合成トランザクション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の順番でコミットしている。
二相ロックを用いたマルチオペレーション・プロセッシングは、ロックをかける実行順によってはデッドロックを生じる場合がある。例えば、図6の合成トランザクションT G1,G2は、レコードD.r14に対してロックをかけようとし、合成トランザクションTG3,G4,G5は、レコードD.r19に対してロックをかけようとしているけれども、お互いに必要なレコードを先にロックし合っているためデッドロックの関係にある。
このデッドロックを解除するには、合成トランザクション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)を行う場合は、次の規約に従って実行していくことになる。
ケース1 項目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)とする。
ケース2 項目Xに対する読み込み処理:
合成トランザクション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の処理を中断することになる。タイムスタンプを用いたマルチオペレーション・プロセッシングがどのようにして、このデータの矛盾を見つけるかは次に述べるとおりである。
合成トランザクションTG1,G2のタイムスタンプを8(合成トランザクションTG1,G2に含まれるトランザクションの中で最もタイムスタンプの大きいトランザクションT8のタイムスタンプを8とした場合)とし(S701)、合成トランザクションTG3,G4,G5のタイムスタンプを11(合成トランザクションTG3,G4,G5に含まれるトランザクションの中で最もタイムスタンプの大きいトランザクションT11のタイムスタンプを11とした場合)とした(S702)とする。
最初に、合成トランザクションTG1,G2がレコードD.r19を読み出すときに、write_TS(D.r19)の値が0(初期の値)であったとすると、ケース2のbの条件write_TS(D.r19) ≦ TS(TG1,G2)を満たすため、read_item(D.r19)を実行し(S703)、read_TS(D.r19) の値を8とする(S704)。
次に、合成トランザクション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)。
次に、合成トランザクションTG3,G4,G5がレコードD.r19に書き込み処理write_item(D.r19)を要求する場合(S707)、ケース1のaのread_TS(D.r19) > TS(TG3,G4,G5), 又はwrite_TS(D.r19) > TS(TG3,G4,G5)の条件を満たすかどうかを確認する。read_TS(D.r19)の値は11、write_TS(D.r19)の値は0、TS(TG3,G4,G5)の値は11であり、ケース1のaの条件を満たさないので、ケース1のbのwrite_item(D.r19) を実行し(S707)、write_TS(D.r19)の値を11とする(S708)。
次に、合成トランザクションTG1,G2がデータ項目D.r19の書き込み処理write_item(D.r19)を要求する場合(S709)、ケース1のaのread_TS(D.r19) > TS(TG1,G2), 又はwrite_TS(D.r19) > TS(TG1,G2)の条件を満たすかどうかを確認する。read_TS(D.r19)の値は11、write_TS(D.r19)の値は11、TS(TG1,G2)の値は8であり、ケース1のaの条件を満たしているので、合成トランザクションTG1,G2の処理を中断することになる。
合成トランザクションTG1,G2を中断するには、合成トランザクションTG1,G2に含まれるトランザクションの中ですでにコミットしたトランザクションT2はそのままにしておき、まだコミットしていないトランザクションT7, T3, T1, T5, T8, T4, T6の処理を中断し、ロールバックすることになる。中断されたトランザクションT7, T3, T1, T5, T8, T4, T6は、トランザクション処理システムに再提出する。
このようにして、タイムスタンプを用いて複数の合成トランザクションの処理を行うのがタイムスタンプを用いたマルチオペレーション・プロセッシングである。
[3.高度なクエリーがトランザクションに含まれている場合のトランザクション処理]
結合演算の処理を行うクエリーなど、複雑で高度なクエリーがトランザクションに含まれている場合、どのようにしてトランザクションを処理するかを、具体例を用いて説明する。図3−1のリレーションDEPARTMENT(300)と図3−2のリレーションEMPLOYEE(400)に対して、下記に示すような処理を行う3つのトランザクションT12,T13,T14がトランザクション処理システムに入力されたとする。
(T12):BEGIN WORK;
-- 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):BEGIN 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):BEGIN 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には、それぞれ結合演算の処理を行うクエリー含まれているので、トランザクション処理システムは、クエリーの最適化を用いて、それらのクエリーに対して、図8に示す処理ツリー(a),(b)を作成する。処理ツリー内の結合演算は|X|で表わし、選択演算はσで表わすことにする。
処理ツリーを作成すると、トランザクション処理システムは、トランザクションT12,T13,T14に対して、トランザクションに含まれる部分処理をタスクとして表わし、トランザクションの部分処理を作成すると次のようになる。
(T12):
(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):
(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):
(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 3は、図8(a)の処理ツリー内の選択演算σDNUMBER=7DEPARTMENTを処理するためのタスクである。
上記のタスクt12 4は、図8(a)の処理ツリー内の選択演算σSSN>2111111124 AND SSN<2411111133 EMPLOYEEを処理するためのタスクである。
上記のタスクt13 2は、図8(b)の処理ツリー内の選択演算σDPHONE = '23-3711'DEPARTMENTを処理するためのタスクである。
上記のタスクt13 3は、図8(b)の処理ツリー内の選択演算σSSN > 2834567894EMPLOYEEを処理するためのタスクである。
上記のタスクt12 5は、図8(a)の処理ツリー内の結合演算であり、トランザクションの部分処理ではTEMP_T12_3|X|DNUMBER=DNUMTEMP_T12_4としておく。TEMP_T12_3は、タスクt12 3の選択処理を行ったときに作成される一時表であり、TEMP_T12_4はタスクt12 4の選択処理を行ったときに作成される一時表である。タスクt12 5の結合処理は一時表TEMP_T12_3,TEMP_T12_4ができたときに、実行されることになる。
上記のタスク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と決定することができる。
トランザクションの実行順を決定すると、トランザクションの実行順にデータを更新することを示した図8(c)の先行グラフに作成する。
トランザクションT13,T12は同一のレコードD.r7,E.r13に対して処理を行うため、トランザクションの実行順に接点T13から接点T12へと枝を入力する。
トランザクションT14,T13は同一のレコードD.r7,E.r13に対して処理を行うため、トランザクションの実行順に接点T14から接点T13へと枝を入力する。
トランザクションT14,T12は同一のレコードE.r13に対して処理を行うため、トランザクションの実行順に接点T14から接点T12へと枝を入力する。
先行グラフを作成すると、トランザクションの実行順にトランザクションT14,T13,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}
結合演算のタスクをグループ分けするには、結合演算の検索元に使用する一時表をリレーションとみなしてグループ分けすることになり、一時表TEMP_T13_3を結合演算の検索元に使用するタスクt13 4をグループG8集め、一時表TEMP_T12_4を結合演算の検索元に使用するタスクt12 5をグループG9に集めることにする。
タスクがグループ分けされて、グループG6,G7,G8,G9が作成されると、グループG6,G7,G8,G9を用いて合成トランザクションTG6,G7,G8,G9を作成し、合成トランザクションTG6,G7,G8,G9に含まれる個々のグループに対して、第一章で述べたマルチオペレーション・プロセッシングを用いて処理することになる。
グループの処理を行うにあたって、グループG8内のタスクt13 4の結合処理は、グループG6内のタスクt13 2の選択処理とグループG7内のタスクt13 3の選択処理が終了してから始めることなる。
また、グループG9内のタスクt12 5の結合処理はグループG6内のタスクt12 3の選択処理とグループG7内のタスクt12 4の選択処理が終了してから始めることになる。
最初にグループG6とグループG7の処理が終了すると、トランザクションT14内のすべてのタスクの処理が終了することになるので、トランザクションT14の処理が終了してコミットすることになる。トランザクションT14がコミットすると、図13(c)の先行グラフから接点T14とその接点から出ているすべての枝を削除する。その結果は、図13(d)の先行グラフとして表わすことができる。
次にグループG8の結合処理が終了してタスクt13 4の処理が終了すると、トランザクションT13内のすべてのタスクの処理が終了するので、トランザクションT13が終了してコミットすることになる。トランザクションT13がコミットすると、図13(d)の先行グラフから接点T13とその接点から出ているすべての枝を削除する。その結果は図13(e)先行グラフとして表わすことができる。
最後にグループG9の結合処理が終了してタスクt12 5の処理が終了すると、トランザクションT12内のすべてのタスクが終了するので、トランザクションT12の処理が終了してコミットすることになる。その結果、合成トランザクションTG6,G7,G8,G9の処理が完了し、入力されたトランザクションT12,T13,T14の処理がすべて終了し、コミットしたことになる。
以上に述べたように、本発明のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングは、高度なクエリー処理がトランザクションに含んでいる場合にも対応することができる。
[4. 実験結果]
本章では、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングによるトランザクション処理の評価のために行った実験とその結果について考察する。実験では、第1章で述べた本発明のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングによるトランザクションの処理時間と、トランザクションの処理を別々に行う従来の二相ロック・プロトコルによるトランザクションの処理時間を測定し、両者の処理時間を比較した。
トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングの処理は、トランザクション処理システムに入力された複数のトランザクションに対して1.1節で述べた手順にしたがって合成トランザクションを作成し、合成トランザクションの処理を行い、1つの合成トランザクションの処理が終了した段階で、新たに数多くのトランザクションが入力されると、同様な手順を用いて別の合成トランザクションを作成し、その合成トランザクションの処理を行っていき、合成トランザクションの処理を順次1つずつ実行した。また、合成トランザクションに含まれる複数のグループの処理は、オペレーティング・システムの複数のプロセスを用いて同時に並行して実行した。
実験を行うには、Windows XP Professional(登録商標)を搭載したパーソナルコンピューター(1つのCeleron CPU 1.73GHzプロセッサ、1GBメインメモリ、1つの145GBディスク)をデータベース・サーバーとして使用した。データベース・サーバーには、独自に開発したデータベース・マネージメント・システムのソフトウェアMOP-DBをインストールし、このソフトウェアを用いて、6つのリレーションから構成されるデータベースを作成し、個々のリレーション対して、主インデックス、2次インデックスなどのインデックスを加えた。MOP-DBのソフトウェアは、従来の二相ロック・プロトコルによるトランザクションの処理と、本発明のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングによるトランザクションの処理の両方ができるように開発しておいた。
次に、独自のクライアントプログラムを作成し、クライアントプログラムからSQLで記述された数多くのトランザクションをデータベース・サーバーに入力し、データベース・サーバーによってすべてのトランザクションが処理されてコミットするまでの時間を測定して、それぞれの手法によるトランザクションの処理時間を求めた。
<実験1: トランザクションの数の影響>
各リレーションに100万件ずつレコードを格納し、6つのリレーションに対して合計600万件ほどのレコードをデータベースに加え、データベースに同時に問い合わせるトランザクションの数を1000件から10000件まで変化させたときの処理時間を図9(a).(b)の表とグラフに示した。トランザクションの処理時間が速くなることは処理速度が速くなることであると考えると、トランザクションの数が1000件から10000件までの件数において、全体的にトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングの処理速度のほうが従来の二相ロック・プロトコルの処理速度よりも速いことがわかる。トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングは、トランザクションの数が1000件から5000件までは、図9(a)の表から、従来の二相ロック・プロトコルの処理速度よりも平均して18.36倍の処理速度が得られ、トランザクションの数が6000件から10000件までは、従来の二相ロック・プロトコルの処理速度よりも平均して19.98倍の処理速度が得られた。
トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングは、トランザクションの数が増えるにつれて処理速度も速くなっていく傾向がある。
図9(b)のグラフに示すように、従来の二相ロック・プロトコルは、トランザクションの数が増えると、数多くのトランザクションが同一のデータ項目を何度も繰り返して読み出し、読み出したレコードに対して更新処理を別々に行い、更新された結果を何度も繰り返してデータベースに書き込むため、トランザクションの処理速度が低下することになった。
一方、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングは、同時に処理するトランザクションの数が増加すると、複数のトランザクションが処理を行う同一のデータ項目を一度だけ読み出し、読み出したレコードに対して複数のトランザクションの更新処理を順次メインメモリ内で行い、最後に更新された結果だけをデータベースに一度だけしか書き込まないので、トランザクションの処理速度が向上した。
<実験2: データベースサイズの影響>
データベースの6つのリレーションに格納されるレコード数を60万件から600万件へと変化させ、それぞれのサイズのデータベースに10000件のトランザクションの処理を一度に要求したときの処理時間を図10(a).(b)の表とグラフに示した。
図10(a).(b)の表とグラフに示すように、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングは、レコード数が60万件から300万件までは、従来の二相ロック・プロトコルの処理速度よりも平均して8.04倍の処理速度が得られ、レコード数が360万件から600万件までは、従来の二相ロック・プロトコルの処理速度よりも平均して15.59倍の処理速度が得られ、データベースのサイズが大きくなるにつれて、処理速度が向上していく傾向がある。従来の二相ロック・プロトコルは、データベースのサイズが大きくなるにつれ、個々のトランザクションの処理に時間がかかるようになった。一方、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングは、データベースのサイズに関係なく効率よく個々の合成トランザクションの処理を実行することができた。
[5. おわりに]
トランザクション処理システムに入力された複数のトランザクションを処理するにあたって、個々のトランザクションを別々に処理することによって発生する従来の問題を解決するために、トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを提案した。
このシステムは、トランザクション処理システムに複数のトランザクションが入力されると、入力されたトランザクションに対して、トランザクションの部分処理を求め、トランザクションの実行順を決定し、決定した順にデータを更新することを示した先行グラフを作成し、トランザクションに含まれる個々の部分処理をタスクとして取り出し、取り出したタスクを、トランザクションの実行順にデータベースのリレーションごとにグループ分けし、グループ分けして作成したグループを用いて合成トランザクションを作成し、合成トランザクションに含まれる個々のグループに対してマルチオペレーション・プロセッシングを用いて処理を行っていくシステムである。
マルチオペレーション・プロセッシングは、グループにタスクが並んだ順にブロックへのアクセス順を決定し、決定したアクセス順にブロックを読み出し、読み出したブロックにアクセスするタスクをグループ内から抽出し、ブロック内のデータ項目に対して、グループ内のタスクが並んだ順にタスク処理を順次行っていく。
ブロック内のデータ項目に対して、グループ内のタスクが並んだ順にタスク処理を順次行っていくということは、ブロック内のデータ項目が先行グラフに存在する場合、そのデータ項目に対して先行グラフに示したトランザクションの実行順にトランザクションの部分処理であるタスク処理を順次行っていくことであり、複数のタスクがそのデータ項目に対して更新処理を行う場合、そのデータ項目に対して最初のタスクの更新処理を行い、更新されたデータ項目に対して次のタスクの更新処理を行い、このような更新処理を繰り返し、最後のタスクの更新処理が行われると、最後に更新された更新結果だけをデータベースに書き込んでいくことである。
このシステムを用いることによって、従来のトランザクションの処理のように、入力された複数のトランザクションに対して、トランザクションごとに同じデータ項目を何度も繰り返して検索し、検索したデータ項目に対して更新処理を別々に行い、更新された結果を何度も繰り返してデータベースに書き込む必要がなくなった。
本発明のシステムは、複数のトランザクションが処理を行うデータ項目に対して、そのデータ項目を一度だけ検索し、検索したデータ項目に対して、複数のトランザクションの更新処理を順次メインメモリ内で行い、最後に更新した結果だけをデータベースに一度だけ書き込めばよいので、極めて効率的に複数のトランザクションの処理を行うことができるようになった。
本発明は、入力された複数のトランザクションに対して、サイクルを含んでいない先行グラフを作成し、複数のトランザクションによって処理されるデータ項目に対して、先行グラフに示したトランザクションの実行順にトランザクションの処理を順次行っていくので、入力された複数のトランザクションは直列可能スケジュール(serializable schedule)で処理される。
合成トランザクションに含まれる個々のグループの処理は、異なるリレーションに対して行うため、それらのグループの処理を同時に行っても、複数のグループ間で同一のデータ項目がアクセスされることはない。グループに集められたタスクの処理は、メインメモリに読み込まれたブロック内のデータ項目に対して、先行グラフに示したトランザクションの実行順に順次行っていくので、入力された複数のトランザクションの間でロックをかけたり、トランザクションを待たせたり、トランザクションを中断したりするといった必要がなくなった。
本発明は、入力された複数のトランザクションに対して1つの合成トランザクションを作成し、合成トランザクションの処理を行っていくことができ、1つの合成トランザクションの処理が終了した段階で、新たに複数のトランザクションが入力されると、それらのトランザクションに対して別の合成トランザクションを作成し、その合成トランザクションの処理を行っていくことができるので、合成トランザクションの処理を1つずつ実行していく場合には、ロックを用いる必要はなくなる。また、デッドロックなどを発生することもなく、合成トランザクションに含まれる複数のグループの処理を同時に並行して実行していくことができるようになった。
合成トランザクションを1つずつ実行していくことで十分にトランザクションの処理速度を向上させることができるが、CPUやディスクなどハードウェア資源を効率よく利用することを考慮する場合には、複数の合成トランザクションを同時に並行して実行することを取り上げ、これらの複数の合成トランザクションの処理を同時に並行して実行するために、二相ロックを用いたマルチオペレーション・プロセッシングとタイムスタンプを用いたマルチオペレーション・プロセッシングを提案した。
トランザクション処理システムのアーキテクチャの構成を示す図である。 トランザクション処理システムのフローチャートを示す図である。 トランザクション処理システムのフローチャートを示す図である。 データベースのリレーションの例を示す図である。 データベースのリレーションの例を示す図である。 複数のトランザクションによるデータの更新順を表わした先行グラフの例を示す図である。 二相ロックを用いたマルチオペレーション・プロセッシングの例を示す図である。 二相ロックを用いたマルチオペレーション・プロセッシングの例を示す図である。 複数の合成トランザクション間でのデッドロックの例を示す図である。 タイムスタンプを用いたマルチオペレーション・プロセッシングの例を示す図である。 処理ツリーと先行グラフの例を示す図である。 トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングの実験結果を示す(a)表,(b)グラフである。 トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングの実験結果を示す(a)表,(b)グラフである。

Claims (4)

  1. トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムであって、
    入力された複数のトランザクションに対してトランザクションの実行順を決定するトランザクション実行順決定手段と、
    前記複数のトランザクションが同一のデータ項目に対して処理を行う場合、そのデータ項目に対する枝を作成し、先に処理を行うトランザクションの接点から次に処理を行うトランザクションの接点にその枝を入力して、前記トランザクションの実行順にデータを更新することを示した先行グラフを作成する先行グラフ作成手段と、
    前記複数のトランザクションに含まれる部分処理をタスクとして取り出すタスク取り出し手段と、
    前記取り出したタスクを、前記トランザクションの実行順に、前記データベースのアクセス領域ごとにグループ分けするグループ分け手段と、
    前記グループ分けして作成したグループを用いて合成トランザクションを作成する合成トランザクション作成手段と、
    前記合成トランザクションに含まれる個々のグループに対してマルチオペレーション・プロセッシングを用いて処理を行うマルチオペレーション・プロセッシング手段と
    を備え、
    前記マルチオペレーション・プロセッシング手段は、グループ分けされたタスクがアクセスするアクセス領域内のブロックを調べ、グループ内のタスクが並んでいる順に該ブロックへのアクセス順を決定し、決定したアクセス順に該ブロックを読み出し、読み出したブロックにアクセスするタスクをグループ内から抽出し、ブロック内のデータ項目に対して、グループ内のタスクが並んでいる順にタスク処理を順次行い、グループ分けされたタスクの処理が終了し、グループ分けされたタスクを包含するトランザクションの処理が終了すると、その時点で終了したトランザクションをコミットするかどうかを、前記先行グラフの終了したトランザクションの接点に入力枝が存在するかどうかで決定し、該トランザクションの接点に入力枝が存在しない場合は、該トランザクションをコミットし、該トランザクションの接点とその接点から出ているすべての枝を削除し
    ブロック内のデータ項目に対して、グループ内のタスクが並んでいる順にタスク処理を順次行っていくということは、ブロック内のデータ項目が前記先行グラフに存在する場合、そのデータ項目に対して前記先行グラフに示したトランザクションの実行順にトランザクションの部分処理であるタスクの処理を順次行っていくことであり、
    複数のタスクがそのデータ項目に対して更新処理を行う場合、そのデータ項目に対して最初のタスクの更新処理を行い、更新されたデータ項目に対して次のタスクの更新処理を行い、このような更新処理を繰り返し、最後のタスクの更新処理が行われると、最後に更新された更新結果だけをデータベースに書き込む
    ことを特徴とするトランザクション処理システム。
  2. 請求項に記載のトランザクション処理システムにおいて、
    2相ロック・プロトコル又はタイムスタンプ・プロトコルを用いて複数の合成トランザクションの処理を同時に並行して実行することを特徴とするトランザクション処理システム。
  3. 請求項1又は2に記載のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムの各機能を、コンピュータ・システムに実現させるためのプログラム。
  4. 請求項1又は2に記載のトランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システムの各機能を、コンピュータ・システムに実現させるためのプログラムを記録した記録媒体。
JP2008120540A 2008-05-02 2008-05-02 トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システム Expired - Fee Related JP4261609B1 (ja)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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 透 降矢 トランザクションの同時実行制御を備えたマルチオペレーション・プロセッシングを用いたデータベースのトランザクション処理システム

Cited By (2)

* Cited by examiner, † Cited by third party
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