3.1. 対話サイクル

グラフに対するすべての書き込み操作は、トランザクション内で実行しなければなりません。トランザクションはスレッドに限定される形で行われ、「フラットネステッドトランザクション」として入れ子にすることができます。フラットネステッドトランザクションとは、すべてのネステッドトランザクションがトップレベルトランザクションのスコープに追加されるという意味です。ネステッドトランザクションはトップレベルトランザクションをロールバック用にマークすることができ、こうするとトランザクション全体がロールバックされます。ネステッドトランザクション内で行われた変更だけをロールバックすることはできません。

トランザクションを行う場合の対話サイクルは次のようになります。

  1. トランザクションを開始します。
  2. グラフに対して書き込み操作を実行します。
  3. トランザクションに成功または失敗のマークを付けます。
  4. トランザクションを終了します。

各トランザクションを終了することが非常に重要です。 トランザクションは、それが終了するまで、取得したロックやメモリを解放しません。Neo4j でのトランザクションは、構文的には try-finally ブロックを使用し、トランザクションを開始したら、書き込み操作を試みます。try ブロック内の最後の操作では、トランザクションに成功のマークを付け、finally ブロックではトランザクションを終了する必要があります。トランザクションを終了すると、成功ステータスに応じてコミットまたはロールバックが実行されます。

[注意]注意

1 つのトランザクション内で行われたすべての変更はメモリ内に保持されます。 したがって非常に大量の更新は、作業をいくつかのトップレベルトランザクションに分割して、メモリを使い切らないようにする必要があります。分割先をトップレベルトランザクションにしなければならないのは、作業を複数のネステッドトランザクションに分割すると、作業全体が元のトップレベルトランザクションに追加されてしまうからです。

スレッドプーリング を使っている環境では、トランザクションを適切に終了しないと、ほかにもエラーが発生する可能性があります。適切に終了していないリークトランザクションの場合を考えてみましょう。このトランザクションは 1 つのスレッドに結び付けられますが、このスレッドが新しいトップレベル (と思われる) トランザクションを開始する操作を実行するようスケジュールされた場合、そのトランザクションは実際にはネステッドトランザクションになります。リークトランザクションの状態が「ロールバックとマーク」されている場合 (デッドロックが検出された場合にはこうなります)、そのトランザクションではそれ以上作業を行うことはできなくなります。さらに作業を行おうとすると、書き込み操作を呼び出すたびにエラーが返ってきます。