操作対象のレコードがすべて同じメジャー・パス・コンポーネントを共有する場合、書込み操作のシーケンスを1つの原子的単位として実行できます。原子的単位とは、すべての操作が正常に実行されるか、いずれも実行されないということです。
また、シーケンスは単独で実行されます。つまり、非常に長いシーケンスを実行するスレッドがある場合、そのシーケンスで使用されているデータに、別のスレッドが割り込めないということです。長時間実行されているシーケンスが完了するまで、シーケンスで行われた変更を別のスレッドが確認することはできません。長時間実行されているシーケンスで使用されているデータを、別のスレッドが変更することもできません。
シーケンスでは書込み操作のみサポートされることに注意してください。シーケンスを使用する場合、ストアへの格納と削除は行えますが、ストアからの取得は行えません。
操作のシーケンスを使用する場合、次のようになります。
シーケンスで使用されるキーはすべて、同じメジャー・パス・コンポーネントを共有する必要があります。
操作はリスト化されますが、必ずしもリスト上の順序で実行されるわけではありません。むしろ、内部的に定義された、デッドロックが起こらない順序で実行されます。
同じキーを操作する複数の操作は作成できません。これを行うと、例外が発生し、操作全体が中止されます。
この章の後半で、OperationFactory
およびKVStore.execute()
を使用して操作のシーケンスを作成し、実行する方法を示します。
シーケンス内の操作でエラーが起きた場合、操作全体が中止されます。この場合、エラーが発生するまでにシーケンスがどこまで実行されたかに関係なく、データは、シーケンスが実行されなかった場合と同じ状態になります。
基本的には、シーケンスが中止される原因は2つあります。
内部操作で、エラーとみなされる例外が発生します。たとえば、操作がDurabilityException
またはConsistencyException
をスローします。また、メッセージの配信またはネットワーク・エラーによる内部エラーがあります。
各操作から正常に復帰しますが、特定の操作で定義されている不成功です。(たとえば、存在しないキーを削除しようとするなどです)。これが起こり、OperationFactoryを使用して操作を作成したときにabortIfUnsuccessful
パラメータにtrue
を指定していた場合、OperationExecutionException
がスローされます。この例外には、失敗した操作に関する情報が含まれています。