(58)【調査した分野】(Int.Cl.,DB名)
1つまたは複数のプロセッサおよびシステムメモリを含むコンピュータアーキテクチャにおいて、2つ以上の実行スレッド間のロック競合を解決する方法であって、前記コンピュータアーキテクチャは、アプリケーションホスト、永続化プロバイダ、およびインスタンスストアをさらに含み、前記アプリケーションホストは、インスタンスを前記インスタンスストアに永続化し、かつ前記インスタンスストアからのインスタンスにアクセスするためのコマンドを発行するように構成された複数の実行スレッドを含み、少なくとも前記コマンドのサブセットが、実行スレッドが実行中にインスタンスのロックを要求することを生じさせ、前記方法は、
前記永続化プロバイダが、第1のコマンドを、前記アプリケーションホストに含まれる第1の実行スレッドから受信する動作であって、前記第1のコマンドは、1つまたは複数の条件を満たす場合に第1のインスタンスに対するロックの取得を要求するように構成される、受信する動作と、
前記永続化プロバイダが、前記第1のコマンドをコマンドログに記録する動作と、
前記永続化プロバイダが、前記第1のコマンドを前記インスタンスストアにサブミットする動作と、
前記永続化プロバイダが、第2のコマンドを、前記アプリケーションホストに含まれる第2の実行スレッドから受信する動作であって、前記第2のコマンドは、前記第2のコマンドにより処理するために第2のインスタンスを前記第2の実行スレッドに対してロックすることを要求するように構成される、受信する動作と、
前記永続化プロバイダが、前記第2のコマンドを前記コマンドログに記録する動作と、
前記永続化プロバイダが、前記第2のコマンドを前記インスタンスストアにサブミットする動作と、
前記永続化プロバイダが、前記第2のコマンドに対するロック応答を、前記インスタンスストアから受信する動作であって、前記ロック応答は、前記アプリケーションホストが前記第2のインスタンスに対するロックの保持者であることを示し、前記ロック応答は、前記第1のコマンドをサブミットした後、かつ前記第1のコマンドが完了する前に受信される、受信する動作と、
前記永続化プロバイダが、前記コマンドログを参照し、前記第1のコマンドの現在の解決が、(a)前記第1のコマンドが前記第1のインスタンスに対するロックを取得したかどうか、ならびに(b)前記第1のインスタンスおよび前記第2のインスタンスが同一のインスタンスであるかどうかを判定するには、十分な情報を提供していないと判定する動作であって、前記十分な情報を提供していないことは、前記第2のコマンドが要求したロックが、それ以前に前記第1のコマンドによって取得されたロックであったかどうかを曖昧にする、判定する動作と、
前記永続化プロバイダが、前記第1のコマンドのさらなる解決に到達するまで、前記第2のコマンドの処理を中断する動作であって、前記さらなる解決は、少なくとも、前記1つまたは複数の条件を満たすことに関する追加情報を提供する、中断する動作と、
前記永続化プロバイダが、前記第1のコマンドの解決に関する前記追加情報に基づき、前記第2のコマンドに関してどのように進めるかを判定する動作と
を含むことを特徴とする方法。
前記永続化プロバイダが、前記追加情報に基づき、前記第1のコマンドは前記第2のコマンドが要求したロックを取得したと判定する動作をさらに含むことを特徴とする請求項1に記載の方法。
前記永続化プロバイダが、前記第1のコマンドをコマンドログに記録する動作は、前記第1のコマンドを、第1のタイムスタンプと共に前記コマンドログに記録する動作であって、前記第1のタイムスタンプは、前記永続化プロバイダのコマンドクロックにより提供される、記録する動作を含み、
前記永続化プロバイダが、前記第2のコマンドを前記コマンドログに記録する動作は、前記第2のコマンドを第2のタイムスタンプと共に前記コマンドログに記録する動作であって、前記第2のタイムスタンプは、前記永続化プロバイダの前記コマンドクロックにより提供される、記録する動作を含む
ことを特徴とする請求項2に記載の方法。
前記永続化プロバイダが、前記追加情報に基づき、前記第1のコマンドは前記第2のコマンドが要求したロックを取得したと判定する動作は、前記第1のタイムスタンプおよび前記第2のタイムスタンプに基づき、前記第1のコマンドを前記第2のコマンドより前に受信したと判定する動作を含むことを特徴とする請求項3に記載の方法。
前記永続化プロバイダが、前記第2のコマンドに関してどのように進めるかを判定する動作は、前記第2のコマンドを失敗とする動作を含むことを特徴とする請求項2に記載の方法。
前記永続化プロバイダが、前記第2のコマンドに関してどのように進めるかを判定する動作は、前記アプリケーションホストを前記第1のコマンドがロックを取得したインスタンスのコピーに導く動作を含むことを特徴とする請求項2に記載の方法。
前記永続化プロバイダが、前記追加情報に基づき、前記第1のコマンドは前記第2のコマンドが要求したロックを取得しなかったと判定する動作をさらに含むことを特徴とする請求項1に記載の方法。
前記永続化プロバイダが、第3のコマンドを、前記アプリケーションホストに含まれる第3の実行スレッドから受信する動作であって、前記第3のコマンドは、1つまたは複数の条件を満たす場合に第3のインスタンスに対するロックの取得を要求するように構成される、受信する動作と、
前記永続化プロバイダが、前記第3のコマンドをコマンドログに記録する動作と、
前記永続化プロバイダが、前記第3のコマンドを前記インスタンスストアにサブミットする動作と、
前記永続化プロバイダが、前記コマンドログを参照し、前記第3のコマンドの現在の解決が、(a)前記第3のコマンドが前記第3のインスタンスに対するロックを取得したかどうか、ならびに(b)前記第3のインスタンスおよび前記第2のインスタンスが同一のインスタンスであるかどうかを判定するには、十分な情報を提供していないと判定する動作であって、前記十分な情報を提供していないことは、前記第2のコマンドが要求したロックが、それ以前に前記第3のコマンドによって取得されたロックであったかどうかを曖昧にする、判定する動作と、
前記永続化プロバイダが、前記第3のコマンドのさらなる解決に到達するまで、前記第2のコマンドの処理を中断する動作であって、前記さらなる解決は、少なくとも、前記1つまたは複数の条件を満たすことに関する追加情報を提供する、中断する動作と、
前記永続化プロバイダが、前記第3のコマンドの解決に関する前記追加情報に基づき、前記第2のコマンドに関してどのように進めるかを判定する動作と
をさらに含むことを特徴とする請求項8に記載の方法。
前記永続化プロバイダが、前記コマンドログを参照し、前記第1のコマンドの現在の解決が、十分な情報を提供していないと判定する動作は、前記第1のコマンド内のエイリアスがインスタンスに対していまだ解決されていないと判定する動作を含むことを特徴とする請求項1に記載の方法。
1つまたは複数のプロセッサおよびシステムメモリを含むコンピュータアーキテクチャにおいて、2つ以上の実行スレッド間のロック競合を解決する方法であって、前記コンピュータアーキテクチャは、1つまたは複数のアプリケーションホスト、永続化プロバイダ、およびインスタンスストアをさらに含み、前記1つまたは複数のアプリケーションホストのそれぞれは、インスタンスを前記インスタンスストアに永続化し、かつ前記インスタンスストアからのインスタンスにアクセスするためのコマンドを発行するように構成された少なくとも1つの実行スレッドを含み、少なくとも前記コマンドのサブセットが、実行スレッドが実行中にインスタンスのロックを要求することを生じさせ、前記方法は、
前記永続化プロバイダが、第1のコマンドを、前記アプリケーションホストに含まれる第1の実行スレッドから受信する動作であって、前記第1のコマンドは、第1のインスタンスに対するロックの取得を要求するように構成される、受信する動作と、
前記永続化プロバイダが、前記第1のコマンドを前記インスタンスストアにサブミットする動作と、
前記永続化プロバイダが、前記第1のコマンドに対するロック応答を、前記インスタンスストアから受信する動作であって、前記ロック応答は、前記アプリケーションホストが前記第1のインスタンスに対するロックを取得したことを示し、前記第1のインスタンスに対するロックは、第1のインスタンスバージョンに対するものである、受信する動作と、
前記永続化プロバイダが、第2のコマンドを、前記アプリケーションホストに含まれる第2の実行スレッドから受信する動作であって、前記第2のコマンドは、前記第2のコマンドにより処理するために第2のインスタンスを前記第2の実行スレッドに対してロックすることを要求するように構成され、前記第2のコマンドは前記第1のコマンドより後に受信される、受信する動作と、
前記永続化プロバイダが、前記第2のコマンドを前記インスタンスストアにサブミットする動作と、
前記永続化プロバイダが、前記第2のコマンドに対するロック応答を前記インスタンスストアから受信する動作であって、前記ロック応答は、前記アプリケーションホストが前記第2のインスタンスに対するロックを取得したことを示し、前記第2のインスタンスに対するロックは、第2のインスタンスバージョンに対するものであり、前記第2のコマンドに対する前記ロック応答は前記第1のコマンドに対する前記ロック応答より後に受信され、前記第2のインスタンスバージョンは前記第1のインスタンスバージョンよりも新しい、受信する動作と、
前記永続化プロバイダが、前記第1のインスタンスおよび前記第2のインスタンスは同一のインスタンスであると判定する動作と、
前記永続化プロバイダが、前記第2のコマンドに対する前記ロック応答に対応する前記第2のインスタンスバージョンは前記第1のコマンドに対する前記ロック応答に対応する前記第1のインスタンスバージョンより新しいインスタンスバージョンであると判定する動作と、
前記第1のコマンドが前記第2のコマンドより前に受信されたとしても、前記第1のコマンドが旧インスタンスバージョンに対するロックを保持しているという前記判定に応じて、前記永続化プロバイダが、前記第1のコマンドを失敗とする動作と
を含むことを特徴とする方法。
【発明を実施するための形態】
【0017】
本発明は、ロック競合を解決する方法、システム、およびコンピュータプログラム製品に及ぶ。本発明の実施形態は、インスタンスストアに格納されたインスタンスをロックしようと試みる2つ以上の実行スレッド間のロック競合を解決する方法を含む。ある実施形態においては、永続化プロバイダは、第1のコマンドを、アプリケーションホストに含まれる第1の実行スレッドから受け取る。第1のコマンドは、1つまたは複数の条件が満たされる場合に第1のインスタンスに対するロックの取得を要求するように構成される。永続化プロバイダは、第1のコマンドをコマンドログに記録する。永続化プロバイダは、第1のコマンドをインスタンスストアにサブミットする。
【0018】
永続化プロバイダは、第2のコマンドを、アプリケーションホストに含まれる第2の実行スレッドから受け取る。第2のコマンドは、第2のコマンドにより処理する第2のインスタンスが第2の実行スレッドに対してロックされることを要求するように構成される。永続化プロバイダは、第2のコマンドをコマンドログに記録する。永続化プロバイダは、第2のコマンドをインスタンスストアにサブミットする。
【0019】
永続化プロバイダは、第2のコマンドに対するロック応答を、インスタンスストアから受け取る。ロック応答は、アプリケーションホストが第2のインスタンスに対するロックの保持者であることを示す。ロック応答を、第1のコマンドをサブミットした後、かつ第1のコマンドが完了する前に受け取る。
【0020】
永続化プロバイダは、コマンドログを参照し、第1のコマンドの現在の解決が、(a)第1のコマンドが第1のインスタンスに対するロックを取得したかどうか、ならびに(b)第1のインスタンスおよび第2のインスタンスが同一のインスタンスであるかどうかを判定するには、十分な情報を提供していないと判定する。十分な情報ではないために、第2のコマンドが要求したロックがそれ以前に第1のコマンドによって取得されたロックであったかどうかに関して、曖昧となる。永続化プロバイダは、第1のコマンドのさらなる解決に到達するまで、第2のコマンドの処理を中断する。第1のコマンドのさらなる解決により、少なくとも、1つまたは複数の条件が満たされていることに関する追加情報を提供する。永続化プロバイダは、追加情報に基づき、第1のコマンドは第2のコマンドが要求したロックを取得したと判定する。永続化プロバイダは、第1のコマンドがそのロックをすでに取得したという判定に応じて、第2のコマンドを失敗とする。
【0021】
他の実施形態においては、永続化プロバイダは、第1のコマンドを、アプリケーションホストに含まれる第1の実行スレッドから受け取る。第1のコマンドは、第1のインスタンスに対するロックの取得を要求するように構成される。永続化プロバイダは、第1のコマンドをインスタンスストアにサブミットする。永続化プロバイダは、第1のコマンドに対するロック応答を、インスタンスストアから受け取る。ロック応答は、アプリケーションホストが、第1のインスタンスに対するロックを取得したことを示す。第1のインスタンスに対するロックは、第1のインスタンスバージョンに対するものである。
【0022】
永続化プロバイダは、第2のコマンドを、アプリケーションホストに含まれる第2の実行スレッドから受け取る。第2のコマンドは、第2のコマンドにより処理する第2のインスタンスを第2の実行スレッドに対してロックすることを要求するように構成される。永続化プロバイダは、第2のコマンドをインスタンスストアにサブミットする。永続化プロバイダは、第2のコマンドに対するロック応答を、インスタンスストアから受け取る。ロック応答は、アプリケーションホストが、第2のインスタンスに対するロックを取得したことを示す。第2のインスタンスに対するロックは、第2のインスタンスバージョンに対するものである。
【0023】
永続化プロバイダは、第1のインスタンスおよび第2のインスタンスが同一のインスタンスであると判定する。永続化プロバイダは、第2のインスタンスバージョンは、第1のインスタンスバージョンより新しいインスタンスバージョンであると判定する。永続化プロバイダは、第1のコマンドが旧インスタンスバージョンに対するロックを保持しているという判定に応じて、第1のコマンドを失敗とする。
【0024】
本発明の実施形態は、例えば、以下でより詳細に論ずるように、1つまたは複数のプロセッサおよびシステムメモリなど、コンピュータハードウェアを含む専用もしくは汎用のコンピュータを備え、または利用することができる。本発明の範囲内にある実施形態はまた、コンピュータ実行可能命令および/もしくはデータ構造を搬送または格納する物理的および他のコンピュータ可読媒体を含む。このようなコンピュータ可読媒体は、汎用または専用のコンピュータシステムによりアクセス可能な任意の利用可能な媒体とすることができる。コンピュータ実行可能命令を格納するコンピュータ可読媒体は、物理的記憶媒体である。コンピュータ実行可能命令を搬送するコンピュータ可読媒体は、伝送媒体である。従って、本発明の実施形態は、少なくとも2つの明らかに異なる種類のコンピュータ可読媒体、すなわちコンピュータ記憶媒体およびコンピュータ伝送媒体を備えることができるが、これらは例であって限定するものではない。
【0025】
コンピュータ記憶媒体には、RAM、ROM、EEPROM、CD−ROMもしくは他の光ディスクストレージ、磁気ディスクストレージもしくは他の磁気記憶装置、または、所望のプログラムコード手段をコンピュータ実行可能命令もしくはデータ構造の形式で記憶するために使用可能、かつ汎用もしくは専用コンピュータによりアクセス可能な他の任意の媒体を含む。
【0026】
「ネットワーク」を、コンピュータシステムおよび/またはモジュールおよび/または他の電子装置間の電子データの移送を可能にする1つまたは複数のデータリンクとして、定義づける。情報が、ネットワークまたは別の通信接続(有線、無線、または有線および無線の組み合わせのいずれか)を介して、コンピュータに転送または与えられる場合、コンピュータはその接続を適切に伝送媒体とみなす。伝送媒体には、所望のプログラムコード手段をコンピュータ実行可能命令もしくはデータ構造の形式で搬送するために使用可能、かつ汎用もしくは専用コンピュータによりアクセス可能なネットワークおよび/またはデータリンクを含むことができる。上記の組み合わせもまた、コンピュータ可読媒体の範囲に含まれるべきである。
【0027】
さらに、コンピュータ実行可能命令またはデータ構造の形式のプログラムコード手段が、様々なコンピュータシステムのコンポーネントに到達すると、それらを伝送媒体からコンピュータ記憶媒体(またはその逆も同様)に自動的に転送することができる。例えば、ネットワークまたはデータリンクを介して受け取ったコンピュータ実行可能命令またはデータ構造を、ネットワークインタフェースモジュール(例えば、「NIC」)内のRAMにバッファリングして、最終的にコンピュータシステムのRAM、および/またはコンピュータシステムにおける揮発性の低いコンピュータ記憶媒体に転送することができる。従って、当然のことながら、コンピュータ記憶媒体を、伝送媒体をも利用する(または主として利用する)コンピュータシステムのコンポーネントに含むことができる。
【0028】
コンピュータ実行可能命令は、例えば、プロセッサにおいて実行される場合、汎用コンピュータ、専用コンピュータ、または専用の処理装置に、ある特定の機能もしくは機能群を実施させる命令およびデータを備える。コンピュータ実行可能命令は、例えば、バイナリ、アセンブリ言語といった中間フォーマットの命令、またはソースコードとすることができる。本主題を構造的特徴および/または方法論的動作に固有の言語で説明したが、当然のことながら、添付請求項で定義する主題は、必ずしも、上述の特徴または動作に限るものではない。むしろ、上述の特徴および動作は、請求項を実装する形式の例として開示されるものである。
【0029】
本発明を、多くのタイプのコンピュータシステム構成を有するネットワークコンピューティング環境において実践することができることは、当業者には認識されよう。そのコンピュータシステム構成には、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、メッセージプロセッサ、ハンドヘルド装置、マルチプロセッサシステム、マイクロプロセッサベースまたはプログラム可能な家庭用電化製品、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、携帯電話、PDA、ページャ、ルータ、スイッチ等が含まれる。本発明を、ネットワークを介してリンクされた(有線データリンク、無線データリンク、または有線データリンクおよび無線データリンクの組み合わせのいずれかによって)ローカルおよびリモートのコンピュータシステムの両方がタスクを実施する分散システム環境において実践することができる。分散システム環境において、プログラムモジュールを、ローカルおよびリモートのメモリ記憶装置両方に配置することができる。
【0030】
図1は、ロック競合の解決を促進するコンピュータアーキテクチャ100の例を示す。
図1を参照すると、コンピュータアーキテクチャ100は、アプリケーションホスト101、永続化プロバイダ103、およびインスタンスストア107を含む。図示したコンピュータシステムのそれぞれは、例えば、LAN(Local Area Network)、WAN(Wide Area Network)、およびインターネットといったネットワークを介して互いに接続されている(または、ネットワークの一部である)。従って、図示したコンピュータシステムのそれぞれ、ならびに他の任意の接続されたシステムおよびそのコンポーネントは、メッセージ関連データを作成し、メッセージ関連データ(例えば、IP(Internet Protocal)データグラム、およびIPデータグラムを利用する、TCP(Transmission Control Protocol)、HTTP(Hypertext Transfer Protocol)、SMTP(Simple Mail Transfer Protocol)等といった他のより高層のプロトコル)を、ネットワークを介して交換することができる。
【0031】
アプリケーションホスト101は、実行スレッド102Aおよび102Bを含む複数の実行スレッドを備える。一般に、実行スレッドは、インスタンスストア107内のインスタンスと相互作用するためのコマンド(例えば、永続化コマンド)を発行するように構成される。アプリケーションホスト101は、例えばプログラムまたは管理ツールといったエンティティとすることができ、実行スレッドは、インスタンスストア107に格納されたインスタンスを操作するアプリケーションホスト101内のモジュールとすることができる。
【0032】
アプリケーションホスト101内で、実行スレッド102A、102B等は、長期運用のアプリケーションのプログラムシーケンスに対応することができる。しかしながら、実行スレッドが、オペレーティングシステムにより与えられた計算スレッドに直接対応しない場合がある。例えば、連続ポイントからの非同期の実行または再開を支えているアプリケーションホストのランタイムにおいては、実行スレッドの計算スレッドへのバインディングは動的かつ過渡的である場合がある。従って、アプリケーションホストの実行スレッドの一部または全てが、1つまたは複数の計算スレッド上で、同時に実行している場合がある。
【0033】
実行スレッド102Aおよび102Bを含むアプリケーションホスト101の各実行スレッドは、アプリケーションホスト101の機能の多くを実施するように構成される。例えば、実行スレッドは、永続化プロバイダからのインスタンスストアに対するインスタンスハンドルを要求し、インスタンス永続化コマンドプロセッサにコマンドをサブミットし、サブミットしたコマンドに応じた永続化したアプリケーションの状態を受け取るよう構成される。従って、一般にアプリケーションホストによって実施されている機能に言及する場合、アプリケーションホストの実行スレッドによって実施される機能を含むことができる。
【0034】
インスタンスストア107は、例えばインスタンス108Aおよび108Bといったインスタンスに、永続性ストレージを提供する。インスタンスストア107は、インスタンスと相互作用するコマンド(例えば、永続化コマンド)を受け取り、処理するように構成される。インスタンスストア107は、永続化コマンドに応じて、アプリケーションの状態を永続化する、ならびに要求しているエンティティ(例えば、実行スレッド)に永続化状態を戻すことができる。
【0035】
一般に、永続化プロバイダ103は、実行スレッドから受け取った永続化コマンドを、インスタンスストア107に適合するコマンドに翻訳するように構成される。例えば、永続化プロバイダ103は、実行スレッド102Aまたは102Bからの永続化コマンドを、インスタンスストア107に適合する永続化コマンドに翻訳することができる。
【0036】
図示したように、永続化プロバイダ103は、インスタンス永続化コマンドプロセッサ104、インスタンスストアドライバ106、コマンドクロック108、およびコマンドログ109を含む。インスタンス永続化コマンドプロセッサ104は、アプリケーションホスト101とインスタンスストア107との間の契約を定義する。そのため、インスタンス永続化コマンドプロセッサ104は、アプリケーションホスト101がインスタンスストア107を修正または検査するコマンドを与えることを可能にする、アプリケーションホスト101とインスタンスストア107との間のインタフェースである。例えば、SQLサーバを用いて実装されたインスタンス永続化コマンドプロセッサ104およびインスタンスストア107の組み合わせは、SQL永続化プロバイダと呼ばれる得る。永続化プロバイダは、インスタンス永続化コマンドプロセッサ104によって定義された1組の許容できる状態修正を用いたホストのコマンドに従って、インスタンスストアの状態を修正する。
【0037】
一般に、コマンドログ109は、アプリケーションホストがサブミットしたコマンドで、コマンドの結果および/または効果がまだアプリケーションホストに表示されていないコマンドを追跡するように構成される。コマンドログ109で追跡されたコマンドは、「インフライト」コマンドと呼ぶことができる。
【0038】
コマンドクロック108は、アプリケーションホストの実行スレッドによるコマンドの提出および/またはコマンドの結果の受け取りの間で、部分的に因果関係のある順序を作成するために用いられる、単調に増えていくカウンタである。
【0039】
従って、コマンドクロック108は、永続化プロバイダ103に対して論理時間を保持するように構成される。必要に応じて、永続化プロバイダ103で受け取ったコマンドに、コマンドクロック108による時刻を用いてタイムスタンプを付して、コマンドログ109に記録することができる。そのため、コマンドクロック108は、コマンドを受け取った順序の時間的理解を促進する。インスタンス永続化コマンドプロセッサ104は、ロック競合(例えば、アプリケーションホスト101の競合する実行スレッド間の)を解決する場合、この時間的理解を(他の情報と共に)用いることができる。
【0040】
コマンドには、一部をコマンドログ109に記録するものもあるが、全てを記録するわけではないかもしれない。コマンドをコマンドログ109に記録するか否かを判定する場合、永続化プロバイダ103は、ロック競合を引き起こす可能性のあるコマンドとロック競合を引き起こす可能性のないコマンドを見分けることができる。ロック競合を引き起こす可能性のあるコマンドは、コマンドログ109に記録される。一方、ロック競合を引き起こす可能性のないコマンドは、記録せずに実行させることができる。
【0041】
一部のコマンドには、それが明らかにロックの取得を何ら要求しないタイプのコマンドであることに起因して、ロック競合を引き起こす可能性がないと判定できるものがある。例えば、インスタンスへの非連携の読取りアクセスを要求するコマンドは、他のコマンドと競合する可能性がたとえあったとしても少なく、従って、(これらのコマンドは、ロックの取得を要求しないので)記録せずに実行させることができる。
【0042】
一方、ロック競合を引き起こす可能性があると判定されるコマンドは、コマンドログ109に記録することができる。コマンドを受け取った際、インスタンス永続化コマンドプロセッサ104は、そのコマンドがすでにロックされているインスタンスに対してロックの取得を要求するものであるかどうか判定するには十分な情報を有していない場合がある。例えば、インスタンスは、様々な異なるエイリアスを用いて識別可能であるかもしれない。したがって、インスタンスのエイリアスを含むコマンドを受け取ると、そのインスタンスのエイリアスがどのインスタンスを指すのか、簡単にはわからないかもしれない。そのため、インスタンス永続化コマンドプロセッサ104は、さらなる情報(インスタンスハンドルに対するエイリアスの解決)を取得するまで、そのコマンドを、ロック競合を引き起こす可能性がないコマンドとして分類することはできない。
【0043】
コマンドがロックの取得を要求するか否かは、コマンドに関連する様々な条件が満たされているかどうかによることができる。
【0044】
永続化プロバイダ103の内部および外部(例えば、時刻、日付等)両方の情報を利用し、関連条件が満たされているかどうかを判定することができる。さらに、永続化プロバイダ103は、インスタンス永続化コマンドプロセッサ104においてコマンドを受け取る前または受け取った後を含む様々な時点で、異なる関連条件に関する情報を認識することができる。従って、追加情報が利用可能になると、検出されたロック競合を引き起こす可能性を取り除くことができる。例えば、水曜日ならばロックの取得を要求するコマンドを、最初に、コマンドログ109に記録することができる。しかし、永続化プロバイダ103は、その日が木曜日であることを認識すると、コマンドをコマンドログ109から取り除くことができる。
【0045】
ある実施形態においては、コマンド自体が、ロックの取得を要求する可能性を示す情報を含むことができる。そのため、インスタンス永続化コマンドプロセッサ104は、そのコマンドがロックの取得を要求している可能性があるかどうかを、コマンドに問い合わせることができる。他の実施形態においては、明らかにロックの取得を要求しないコマンドのリストを保持する。コマンドを受け取ると、インスタンス永続化コマンドプロセッサ104は、そのリストを参照することができる。
【0046】
一般に、インスタンスストアドライバ106は、インスタンスストア107に適合する通信に必要な場合、コマンドを分解するように構成される。例えば、アプリケーションホストのコマンドセットが、インスタンスストアのコマンドセットのある特定のコマンドを欠いている場合がある。しかしながら、インスタンスストアのコマンドセットの2つ以上のコマンドの組み合わせを用いて、アプリケーションホストのコマンドセットのコマンドを実現することができるかもしれない。従って、永続化プロバイダ103は、受け取った永続化コマンドがインスタンスストアのコマンドセットに含まれていないことを検出した場合、インスタンスストアドライバ106を参照して、そのコマンドを他の適合するコマンドに分解することができる。
【0047】
時々、実行スレッド102A、102B等は、永続化プロバイダ103にコマンドをサブミットすることができる。必要に応じて、受け取ったコマンドには、コマンドクロック108によってタイムスタンプを付し、コマンドログ109に格納することができる。
【0048】
図3は、2つ以上の実行スレッド間のロック競合を解決する方法300の例の流れ図を示す。方法300を、コンピュータアーキテクチャ100のコンポーネントおよびデータに関して説明する。
【0049】
方法300は、永続化プロバイダ(例えば、永続化プロバイダ103)が第1のコマンドをアプリケーションホストに含まれる第1の実行スレッドから受け取る動作であって、第1のコマンドは、1つまたは複数の条件が満たされる場合に第1のインスタンスに対するロックの取得を要求するように構成される動作(動作301)を含む。例えば、インスタンス永続化コマンドプロセッサ104が、条件133を含むコマンド111を実行スレッド102Aから受け取ることができる。コマンド111は、条件133が満たされる場合にインスタンス108Aに対するロックの取得を要求するように構成される。条件133は、例えば、「今日が水曜日ならば、ロックをかけよ。」というような条件文を表すことができる。
【0050】
方法300は、永続化プロバイダが第1のコマンドをコマンドログに記録する動作(動作302)を含む。例えば、コマンド111を受け取った際、インスタンス永続化コマンドプロセッサ104が、コマンド111がロック競合を引き起こす可能性がないと確信を持って判定するには十分な情報を有していない場合がある(例えば、インスタンス永続化コマンドプロセッサ104は、今日が水曜日かどうか知らない場合がある)。そのため、インスタンス永続化コマンドプロセッサ104は、コマンド111をコマンドログ109に記録する。ある実施形態においては、コマンドログ109への入力は、コマンドおよび、コマンドクロック108からのタイムスタンプを含む。例えば、入力131は、コマンド111および時刻121を含む。
【0051】
方法300は、永続化プロバイダが第1のコマンドをインスタンスストアにサブミットする動作(動作303)を含む。例えば、インスタンスストアドライバ106が、コマンド111をインスタンスストア107にサブミットすることができる。
【0052】
方法300は、永続化プロバイダが第2のコマンドをアプリケーションホストに含まれる第2の実行スレッドから受け取る動作であって、第2のコマンドは、第2のコマンドにより処理する第2のインスタンスを第2の実行スレッドに対してロックすることを要求するように構成される動作(動作304)を含む。例えば、インスタンス永続化コマンドプロセッサ104が、コマンド112を実行スレッド102Bから受け取る。コマンド112は、コマンド112により処理する第2のインスタンスを実行スレッド102Bに対してロックすることを要求するように構成される。
【0053】
方法300は、永続化プロバイダが第2のコマンドをコマンドログに記録する動作(動作305)を含む。例えば、コマンド112を受け取った際、インスタンス永続化コマンドプロセッサ104が、コマンド112がロック競合を引き起こす可能性がないと確信を持って判定するには十分な情報を有していない場合がある。例えば、インスタンス永続化コマンドプロセッサ104は、コマンド112のエイリアスがロックの取得がすでに要求されているインスタンスを指すかどうか判定するための情報を欠いている場合がある。そのため、インスタンス永続化コマンドプロセッサ104は、コマンド112および時刻122(時刻121より後の時刻)を含む入力132を、コマンドログ109に記録する。
【0054】
方法300は、永続化プロバイダが第2のコマンドをインスタンスストアにサブミットする動作(動作306)を含む。例えば、インスタンスストアドライバ106が、コマンド112をインスタンスストア107にサブミットすることができる。
【0055】
方法300は、永続化プロバイダが第2のコマンドに対するロック応答をインスタンスストアから受け取る動作であって、ロック応答は、アプリケーションホストが第2のインスタンスに対するロックの保持者であることを示し、ロック応答は、第1のコマンドをサブミットした後、かつ第1のコマンドが完了する前に受け取られる動作(動作307)を含む。例えば、インスタンスストアドライバ106は、ロック応答114をインスタンスストア107から受け取ることができる。ロック応答114は、アプリケーションホスト101がインスタンス108Aに対するロックの保持者であることを示すことができる。ロック応答114を、コマンド111をサブミットした後、かつコマンド111を完了する前に(例えば、インスタンスストアドライバ106は、ロック応答113をまだ受け取っていないかもしれない)受け取ることができる。
【0056】
方法300は、永続化プロバイダがコマンドログを参照し、第1のコマンドの現在の解決が、(a)第1のコマンドが第1のインスタンスに対するロックを取得したかどうか、ならびに(b)第1のインスタンスおよび第2のインスタンスが同一のインスタンスであるかどうかを判定するには、十分な情報を提供していないと判定する動作であって、十分な情報ではないために、第2のコマンドが要求したロックがそれ以前に第1のコマンドによって取得されたロックであったかどうかに関して、曖昧となる動作(動作308)を含む。例えば、永続化プロバイダ103が、コマンド111がロックを取得したかどうか、および/またはコマンド111及び112が同一のインスタンスを指しているかどうかを判定するには十分な情報を有していない場合がある。十分な情報ではないために、コマンド112が要求したロックがそれ以前にコマンド111によって取得されたかどうかに関して、曖昧となる。
【0057】
永続化プロバイダは、コマンドが明らかにインスタンス108Aではないインスタンスのみを指していることにより、ロック競合を引き起こす可能性はないと判定できるコマンドログ内のコマンドを、除外することができる。例えば、インスタンス永続化コマンドプロセッサ104は、コマンドログ109内のコマンドが、インスタンス108Aに対するエイリアスの何れでもないとわかる未解決のインスタンスのエイリアスを有していると判定することができる。
【0058】
方法300は、永続化プロバイダが、第1のコマンドのさらなる解決に到達するまで、第2のコマンドの処理を中断する動作であって、さらなる解決により、少なくとも、1つまたは複数の条件が満たされていることに関する追加情報が提供される動作(動作309)を含む。例えば、永続化プロバイダ103は、コマンド111のさらなる解決に到達するまで、コマンド112の処理を中断することができる。コマンド111のさらなる解決により、条件133が満たされていることに関する情報が提供されることが可能である。例えば、コマンド111が未解決のインスタンスのエイリアスに対するロックを要求する場合、永続化プロバイダ103は、インスタンスのエイリアスがある特定のインスタンスに対して解決されるまで、コマンド112の処理を中断することができる。さらに、永続化プロバイダ103は、コマンド111がインスタンス108Aに対するロックを取得したこと(および従って、コマンド111のいずれのエイリアスもインスタンス108Aを指すものであったこと)を示すロック応答113を受け取るかもしれない。
【0059】
方法300は、永続化プロバイダが、第1のコマンドの解決に関する追加情報に基づき、第2のコマンドに関してどのように進めるかを判定する動作を含む(動作310)。ある実施形態においては、永続化プロバイダが、追加情報に基づき、第1のコマンドは第2のコマンドが要求したロックを取得したと判定する。例えば、インスタンス永続化コマンドプロセッサ104は、コマンド111はインスタンス108Aに対するロックを取得したと判定することができる。インスタンス永続化コマンドプロセッサ104はまた、コマンド112もまたインスタンス108Aのロックを要求したので(しかしインスタンス108Aのロックがすでにコマンド111によって取得された後に)、コマンド112はロック応答114を受け取ったと判定することができる。必要に応じて、インスタンス永続化コマンドプロセッサ104は、コマンドログ109を参照し、コマンド111をコマンド112より前に受け取ったと判定することができる。これらの実施形態においては、永続化プロバイダは、第1のコマンドがロックを取得したという判定に応じて、第2のコマンドを失敗とする。例えば、永続化プロバイダ103が、コマンド111がインスタンス108Aに対するロックを取得したという判定に応じて、コマンド112を失敗とすることができる。
【0060】
他の実施形態においては、永続化プロバイダは、追加情報に基づき、第1のコマンドは第2のコマンドが要求したロックを取得しなかったと判定する。例えば、インスタンス永続化コマンドプロセッサ104は、コマンド111はインスタンス108Aに対するロックを取得しなかったと判定することができる。これらの他の実施形態においては、アプリケーションホストに、第2のコマンドに対して受け取ったロック応答が示すロックを無効にすることを試みるよう指示することができる。例えば、アプリケーションホスト101に、コマンド112に対するロック応答114に示されたロックを無効にすることを試みるよう指示することができる。
【0061】
ロックを無効にする1つの理由は、ロックが誤ったロックであると判定される場合があるためである。例えば、残されたロックが、アプリケーションホストによって忘れさられた、以前の計算から残されたものである場合がある。したがって、第2のコマンドをインスタンスストアが受け取った時点で、そのロックは存在したが、アプリケーションホストは第2のコマンドの応答を受け取った際、そのロックの記録を有していない。第2のコマンドと競合する可能性のあるそれ以前に発行したコマンドの全てが、そのロックを取得していなかったことがわかった場合、誤ったロックが検出される可能性がある。
【0062】
あるいは、永続化プロバイダ103は、アプリケーションホスト101に、すでにコマンド111に対してロックされているインスタンス108Aのコピーを用いるよう指示することができる。
【0063】
本発明の実施形態はまた、さらなるコマンドを含むロック競合の解決を含む。例えば、永続化プロバイダは、第3のコマンドを、アプリケーションホストに含まれる第3の実行スレッドから受け取ることができる。第3のコマンドは、1つまたは複数の条件を満たす場合、第3のインスタンスに対するロックの取得を要求するように構成可能である。永続化プロバイダは、第3のコマンドをコマンドログに記録することができる。
【0064】
永続化プロバイダは、第3のコマンドをインスタンスストアにサブミットする。永続化プロバイダは、コマンドログを参照し、第3のコマンドの現在の解決が、(a)第3のコマンドが第3のインスタンスに対するロックを取得したかどうか、ならびに(b)第3のインスタンスおよび第2のインスタンスが同一のインスタンスであるかどうかを判定するには、十分な情報を提供していないと判定する。十分な情報ではないために、第2のコマンド(例えば、コマンド112)が要求したロックが第3のコマンドによってそれ以前に取得されたロックであったかどうかに関して、曖昧となる。
【0065】
永続化プロバイダは、第3のコマンドのさらなる解決に到達するまで、第2のコマンドの処理を中断する。さらなる解決により、少なくとも、1つまたは複数の条件を満たしていることに関する追加情報を提供する。永続化プロバイダは、第3のコマンドの解決に関する追加情報に基づき、第2のコマンドに関してどのように進めるかを判定する。
【0066】
図2は、ロック競合の解決を促進するコンピュータアーキテクチャ200の例を示す。
図2を参照すると、コンピュータアーキテクチャ200は、アプリケーションホスト201、永続化プロバイダ203、およびインスタンスストア207を含む。コンピュータアーキテクチャ100と同様に、図示したコンピュータシステムのそれぞれは、例えば、LAN(Local Area Network)、WAN(Wide Area Network)、およびインターネットといったネットワークを介して互いに接続されている(または、ネットワークの一部である)。従って、図示したコンピュータシステムのそれぞれ、ならびに他の任意の接続されたシステムおよびそのコンポーネントは、メッセージ関連データを作成し、メッセージ関連データ(例えば、IP(Internet Protocal)データグラム、および、IPデータグラムを利用する、TCP(Transmission Control Protocol)、HTTP(Hypertext Transfer Protocol)、SMTP(Simple Mail Transfer Protocol)等といった他のより高層のプロトコル)を、ネットワークを介して交換することができる。
【0067】
図2において、
図1と同様にラベル付けされたコンポーネントは、同様の機能を含む。例えば、アプリケーションホスト201は、実行スレッド202A、および202Bを含む複数の実行スレッドを備える。一般に、実行スレッドは、インスタンスストア207内のインスタンスと相互作用するためのコマンド(例えば、永続化コマンド)を発行するように構成される。アプリケーションホスト201は、例えばプログラムまたは管理ツールといったエンティティとすることができ、実行スレッドは、インスタンスストア207に格納されたインスタンスを操作するアプリケーションホスト201内のモジュールとすることができる。
【0068】
インスタンスストア207は、例えばインスタンス208といったインスタンスに、永続性ストレージを提供する。インスタンスストア207は、インスタンスと相互作用するためのコマンド(例えば、永続化コマンド)を受け取り、処理するように構成される。インスタンスストア207は、永続化コマンドに応じて、アプリケーションの状態を永続化する、ならびに要求しているエンティティ(例えば、実行スレッド)に永続化状態を戻すことができる。
【0069】
一般に、永続化プロバイダ203は、実行スレッドから受け取った永続化コマンドを、インスタンスストア207に適合するコマンドに翻訳するように構成される。例えば、永続化プロバイダ203は、実行スレッド202Aまたは202Bからの永続化コマンドを、インスタンスストア207に適合する永続化コマンドに翻訳することができる。
【0070】
図示したように、永続化プロバイダ203は、インスタンス永続化コマンドプロセッサ204、インスタンスストアドライバ206、およびコマンドログ209を含む。インスタンス永続化コマンドプロセッサ204は、アプリケーションホスト201とインスタンスストア207との間の契約を定義する。そのため、インスタンス永続化コマンドプロセッサ204は、アプリケーションホスト201がインスタンスストア207を修正または検査するコマンドを与えることを可能にする、アプリケーションホスト201とインスタンスストア207との間のインタフェースである。例えば、SQLサーバを用いて実装されたインスタンス永続化コマンドプロセッサ204およびインスタンスストア207の組み合わせは、SQL永続化プロバイダと呼ばれ得る。永続化プロバイダは、インスタンス永続化コマンドプロセッサ204によって定義された1組の許容できる状態修正を用いたホストのコマンドに従って、インスタンスストアの状態を修正する。
【0071】
永続化プロバイダ103における機能と同様に、コマンドには、一部をコマンドログ209に記録するものもあるが、全てを記録するわけではないかもしれない。コマンドをコマンドログ209に記録するかどうかを判定する場合、永続化プロバイダ203は、ロック競合を引き起こす可能性のあるコマンドとロック競合を引き起こす可能性のないコマンドを見分けることができる。ロック競合を引き起こす可能性のあるコマンドは、コマンドログ209に記録される。一方、ロック競合を引き起こす可能性のないコマンドは、記録せずに実行させることができる。インスタンス永続化コマンドプロセッサ204は、コマンドプロセッサ104がコマンドをコマンドログ109に記録することに関して判定を下す方法と同様に、これらの判定を下すことができる。
【0072】
一般に、インスタンスストアドライバ206は、インスタンスストア207に適合する通信に必要な場合、コマンドを分解するように構成される。例えば、アプリケーションホストのコマンドセットが、インスタンスストアのコマンドセットのある特定のコマンドを欠いている場合がある。しかしながら、インスタンスストアのコマンドセットの2つ以上のコマンドの組み合わせを用いて、アプリケーションホストのコマンドセットのコマンドを実現することができるかもしれない。従って、永続化プロバイダ203は、受け取った永続化コマンドがインスタンスストアのコマンドセットに含まれていないことを検出した場合、インスタンスストアドライバ206を参照して、そのコマンドを他の適合するコマンドに分解することができる。
【0073】
図示したように、インスタンスストア207は、インスタンスクロック281を含む。インスタンスクロック281は、インスタンスストア207に格納されたインスタンスに対するバージョンを保持するように構成される。インスタンスクロック281は、バージョンをいつ更新すべきかを定義するバージョン更新規則に従って、バージョンを保持することができる。例えば、バージョン更新規則は、排他的なロックがインスタンスにかかった場合、排他的なロックがインスタンスに対して解除される都度、インスタンスに関連する永続化状態が修正された場合等に、インスタンスのバージョンを更新する(増やす)べきと、指示することができる。インスタンスのバージョンを保持するステップには、バージョンが更新されるべき時、カウンタを増やすステップを含むことができる。例えば、現在はバージョン3であるインスタンスからのデータを修正すると、インスタンスをバージョン4に増やすことができる。永続化プロバイダ203は、ロック競合を解決する際、インスタンスのバージョンを用いることができる。
【0074】
時々、実行スレッド202A、202B等は、コマンドを永続化プロバイダ203にサブミットすることができる。これもまた図示するように、他のコマンド/結果217を、インスタンスストア207および他のアプリケーションホスト間で(おそらく、他の中間永続化プロバイダを介して)伝達し合うことができる。従って、アプリケーションホスト201ならびに他のアプリケーションホストが、インスタンスストア207と相互作用することができ、インスタンスのバージョンを変更させる可能性がある。例えば、(アプリケーションホスト201および/または他のアプリケーションホストから)受け取ったコマンドに応じて、インスタンス208は、バージョン261(より初期のバーション)からバージョン263(より最近のバージョン)に遷移することができる。
【0075】
図4は、2つ以上の実行スレッド間のロック競合を解決する方法400の例の流れ図を示す。方法400を、コンピュータアーキテクチャ200のコンポートネントおよびデータに関して説明する。
【0076】
方法400は、永続化プロバイダが第1のコマンドをアプリケーションホストに含まれる第1の実行スレッドから受け取る動作であって、第1のコマンドは、第1のインスタンスに対するロックの取得を要求するように構成される動作(動作401)を含む。例えば、インスタンス永続化コマンドプロセッサ204が、コマンド211を実行スレッド202Aから受け取ることができる。コマンド211を、インスタンス208に対するロックの取得を要求するように構成することができる。
【0077】
方法400は、永続化プロバイダが第1のコマンドをインスタンスストアにサブミットする動作(動作402)を含む。例えば、インスタンスストアドライバ206が、コマンド211をインスタンスストア207にサブミットすることができる。
【0078】
方法400は、永続化プロバイダが第1のコマンドに対するロック応答をインスタンスストアから受け取る動作であって、ロック応答は、アプリケーションホストが第1のインスタンスに対するロックを取得したことを示し、第1のインスタンスに対するロックは、第1のインスタンスバージョンに対するものである動作(動作403)を含む。例えば、インスタンスストアドライバ206は、ロック応答213をインスタンスストア207から受け取ることができる。ロック応答213は、コマンド211がインスタンス208のバージョン261をロックしたことを示す。インスタンス永続化プロバイダ204は、入力231をコマンドログ209に記録することができる。図示するように、入力231は、コマンド211をロック応答213に関連付ける。
【0079】
方法400は、永続化プロバイダが第2のコマンドをアプリケーションホストに含まれる第2の実行スレッドから受け取る動作であって、第2のコマンドは、第2のコマンドにより処理する第2のインスタンスが第2の実行スレッドに対してロックされることを要求するように構成される動作(動作404)を含む。例えば、インスタンス永続化コマンドプロセッサ204は、コマンド212を実行スレッド202Bから受け取ることができる。コマンド212を、インスタンス208に対するロックの取得を要求するように構成することができる。
【0080】
方法400は、永続化プロバイダが第2のコマンドをインスタンスストアにサブミットする動作(動作405)を含む。例えば、インスタンスストアドライバ206は、コマンド212をインスタンスストア207にサブミットすることができる。
【0081】
方法400は、永続化プロバイダが第2のコマンドに対するロック応答をインスタンスストアから受け取る動作であって、ロック応答は、アプリケーションホストが第2のインスタンスに対するロックを取得したことを示し、第2のインスタンスに対するロックは、第2のインスタンスバージョンに対するものである動作(動作406)を含む。例えば、インスタンスストアドライバ206は、ロック応答214をインスタンスストア207から受け取ることができる。ロック応答214は、コマンド212がインスタンス208のバージョン263をロックしたことを示す。
【0082】
前述のように、他のアプリケーションホストは、(他のコマンド/結果217で示すように)インスタンスストア207と相互作用することができる。従って、コマンド211および212を、インスタンスストア207で受け取った(他のアプリケーションホストからの)他のコマンドに組み入れることができる。様々な要因の内の何れかによって、インスタンスストア207は、アプリケーションホストが以前に取得したロックを解除する可能性がある。例えば、通信の失敗により、インスタンスストア207は、もはや自らが実行スレッド202A(および/または永続化プロバイダ203)と通信していないと検出する可能性がある。結果として、インスタンスストア207は、実行スレッド202Aが以前取得したロックを解除する可能性がある。しかしながら、これもまた通信の失敗の結果として、アプリケーションホスト201および/または永続化プロバイダ203には、インスタンスストア207がロックを解除したことがわからない場合もある。従って、例えば、実行スレッド202Aは、ロックが実際にはインスタンスストア207において既に解除されているにもかかわらず、ロック応答213に示されたロックをあたかも取得しているかのように継続する可能性がある。
【0083】
ロックを解除した後に、別のアプリケーションホストが同一のインスタンスに対するロックを取得し、バージョンを更新させる可能性がある。例えば、他のコマンド/結果217におけるコマンドを介して、インスタンス208は、バージョン261(より初期のバージョン)からバージョン263(より最近のバージョン)に更新される可能性がある。
さらに、実行スレッド202Aがロック応答213に基づき継続しているが、実際にはインスタンス208に対してロックを有していない間に、この事態は起こる可能性がある。
【0084】
方法400は、永続化プロバイダが第1のインスタンスおよび第2のインスタンスは同一のインスタンスであると判定する動作(動作407)を含む。例えば、インスタンス永続化コマンドプロセッサ204は、ロック応答213および214は両方ともインスタンス208に対するロックの取得を要求したものであると判定することができる。
【0085】
方法400は、永続化プロバイダが、第2のインスタンスバージョンは第1のインスタンスバージョンより新しいインスタンスバージョンであると判定する動作(動作408)を含む。例えば、インスタンス永続化プロバイダ204は、バージョン261およびバージョン263を比較することができる。その比較から、インスタンス永続化コマンドプロセッサ204は、インスタンス208のバージョン263がインスタンス208のバージョン261より新しく、従ってバージョン261が旧式ものであると判定することができる。
【0086】
方法400は、第1のコマンドが旧式のインスタンスバージョンに対するロックを保持しているという判定に応じて、永続化プロバイダが第1のコマンドを失敗とする動作(動作409)を含む。例えば、インスタンス永続化コマンドプロセッサ204は、コマンド211がバージョン261に対するロックを保持しているという判定に応じて、コマンド211を失敗とすることができる。
【0087】
コマンドを失敗とするステップは、そのコマンドが成功裏に完了したことを以前に示した場合に、実行スレッドまたはアプリケーションホストに通知するステップを含むことができる。例えば、ロック競合を検出する前に、インスタンス永続化コマンドプロセッサ204は、コマンド211が正常に完了したことを実行スレッド202Aに示すことができる。ロック競合を検出した後で、インスタンス永続化コマンドプロセッサ204は、コマンド211が失敗となったことを実行スレッド202Aまたはアプリケーションホスト201に示すことができる。実行スレッド202Aまたはアプリケーションホスト201は、コマンド211が失敗となったという通知に基づき、修正動作を行うことができる(例えば、実行スレッド202Aがインスタンス208に対して実施している計算を停止することによって)。
【0088】
上述のように、アプリケーションホストは、例えば、ロックを誤りであると判定する場合、ロックを無効にしようと試みることができる。ロックを無効にするステップは、ロックの取得の試みを繰り返すステップ、既存のロックをロック競合によって示された特定のロックのバージョンと共にアプリケーションホストが保持している場合、その既存のロックを潜在的に無視するステップを含むことができる。ロックは、第2のコマンドをインスタンスストアが受け取った後に解除することができるので、その後別のアプリケーションホスト、または同一のアプリケーションでさえ、ロック競合の解決中にそのインスタンスをロックしていることがあり得る。従って、ロックのバージョニングは、ロックの取得を試みている間に、第2のロック競合におけるロックが以前に第1のロック競合中に示されたロックとは異なることを検出する機構を提供する。
【0089】
そのため、第2のロック競合は、(方法300及び400に関して説明したように)何れかのタイプのロック競合であり得る。さらにいずれかのタイプのロック競合が、第1のロック競合について知らずに、取り扱われる可能性がある。従って、連続的な試みは独立している。例えば、第2のコマンドを再試行する前に、そのインスタンスを再びロックした新しいコマンドへの応答を受け取ることさえあり得る。従って、新しいバージョンにおけるロックがすでに受け取られ、ロックの取得は、インスタンスストアに戻る必要なく失敗とすべきと判定される可能性がある。
【0090】
本発明の実施形態はまた、方法300及び400において説明したものと同様の技術を同時に実装することによって、3つ以上のコマンド間のロック競合を解決するステップを含む。例えば、3つのコマンド間のロック競合を、ロックのバージョンの組み合わせを用いて、いつコマンドを受け取ったかを判定して、解決することができる。
【0091】
従って、本発明の実施形態は、各永続化状態格納場所に対して、状態永続化システムによって保持された論理ロッククロックを採用することができる。ロック時間を、インスタンス永続化コマンドプロセッサによって実施されるブックキーピングに組み込んで、インスタンスが以前の論理時間にアプリケーションホストによってロックされている場合と、インスタンスがアプリケーションホストによって異なる名前で同時にロックされている場合を区別することができる。インスタンス永続化コマンドプロセッサはさらに、発行されたコマンドのどれがロックをかける可能性があるかを判定するために内観するとともに、アプリケーションホストが状態永続化システムに発行したコマンドに対して論理コマンドクロックを保持することができる。次いで、インスタンス永続化コマンドプロセッサは、ロック競合する可能性のあるコマンドの影響が明らかになるまでコマンドの実行を中断し、ロック時間を調べて永続化状態格納場所の複数のコピーの中から見分けることによって、競合を解決することができる。
【0092】
例えば、本発明の実施形態を用いて、並行して行われた要求を再順序付けすることによって引き起こされたロック競合を解決することができる。インスタンス永続化コマンドプロセッサは、第1の実行スレッドから、インスタンスへ配信するための第1のアプリケーションメッセージを受け取ることができる。しかしながら、第1のアプリケーションメッセージの内容によっては、宛先のインスタンスが明確でない場合がある。例えば、第1のアプリケーションメッセージが、インスタンスそれ自体に対する固有の識別子ではなく、インスタンスのデータの一部であるビジネス情報(注文番号等)を含んでいる場合がある。アプリケーションホストでさえ、第1のアプリケーションメッセージを正しい宛先のインスタンスへと解決できない場合がある。例えば、固有のインスタンス識別子を求めて第1のアプリケーションメッセージを調べ、またメッセージ内のビジネス情報に対応するデータを求めて以前にロードされたインスタンスを探しても、アプリケーションホストが適切なインスタンスを見つけられない場合がある。インスタンスストアは、メッセージ内の情報をあるインスタンスのデータと相関させることによって、第1のアプリケーションメッセージをある特定のインスタンスへと解決することができる場合がある。従って、アプリケーションホストは、インスタンスストアに適切なインスタンスをロードするように(または、適切なインスタンスがまだ存在しない場合には新しいインスタンスを作成するように)依頼する場合がある。
【0093】
原則的に同時に、アプリケーションホストが、第2のアプリケーションメッセージを、第2の並行実行スレッドにおいて受け取る。第2のアプリケーションメッセージも同様に、宛先のインスタンスを一意的に特定していない場合がある。さらに、第2のアプリケーションメッセージが異なるビジネス情報を含んでいる場合がある。例えば、第2のアプリケーションメッセージは、注文番号を含むのではなく、顧客の配送先を含んでいる場合がある。従って、2つのアプリケーションメッセージは、同じ宛先のインスタンスを指すことがあるが、アプリケーションホストはこの関係性を検出することができない場合がある。そのため、第2の実行スレッドは、続いて、インスタンスストアに適切なインスタンスをロードするように(または、適切なインスタンスがまだ存在しない場合には新しいインスタンスを作成するように)依頼する。
【0094】
再順序付けのため、第2の実行スレッドへの応答は、アプリケーションホストがすでに関連インスタンスをロックしているというものである可能性がある。しかしながら、アプリケーションホストは、さらにロックの通知を受け取る必要があるかもしれない。したがって、インスタンス永続化コマンドプロセッサがコマンドログを参照し、競合を解決することができる。
【0095】
他の連続する事象もインスタンスストアによる同様の応答へつながる場合がある。例えば、アプリケーションホストは、実行スレッドをすでに停止しているか、以前にクラッシュしたことがあるため、インスタンスをロックしたという自らの記録を失っているものの、インスタンスストアは、アプリケーションホストがコピーを有しているといまだ認識している場合がある。同様の競合が、アプリケーションホストが1つの実行スレッドにおいてインスタンスを保存およびアンロードする一方で、別の実行スレッドが同時に同一のインスタンスをロードする場合に、発生する可能性がある。ロック競合を解決するには、アプリケーションホストおよびインスタンスストアの状態を常に調整するために、これらの様々な場合を見分けなければならない。本発明の実施形態を用いて、これら、ならびに他のさらなる連続する事象から起こるロック競合を解決することができる。
【0096】
本発明の実施形態にはまた、1つまたは複数の永続化プロバイダを有するコンピュータアーキテクチャを含む。各永続化プロバイダは、複数のアプリケーションホストを設け、そのそれぞれが1つまたは複数の実行スレッドを備え、インスタンスストアに格納されたインスタンスにアクセスする。これらの実施形態においては、各インスタンス永続化プロバイダはコマンドクロックを含むことができ、インスタンスストアはインスタンスクロックを含むことができる。コマンドクロックから、およびインスタンスクロックから得られる情報を用いて、時間的な順序付けおよびバージョニングの両方に基づき、アプリケーションホスト間のロック競合を解決することができる。従って、本発明の実施形態は、コマンドが異なる時刻に受け取られ、インスタンスの異なるバージョンを指す場合の、複数のアプリケーションホスト間のロック競合を解決することができる。
【0097】
本発明を、本発明の趣旨または本質的特徴から逸脱することなく、他の特定の形式で具現化することができる。説明した実施形態は、あらゆる点で、単に例示であって制限するものではないとみなされるべきである。従って、本発明の範囲は、前述の説明によってではなく、添付請求項によって示すものである。請求項と同等の意味および範囲内にあるあらゆる変更は、請求項の範囲内に包含すべきものである。