2015-11-27 194 views
1
Transaction beginTx = db.beginTx(); 
try { 
// do update neo4j 
    beginTx.success(); 
    System.println("ok"); 
} catch (Exception ex) { 
} finally { 
beginTx.close(); 
} 

控制檯打印「ok」。但我的數據沒有保存到neo4j,我發現這個事務是PlaceboTransaction。PlaceboTransaction和TopLevelTransaction之間有什麼區別

回答

1

根據rubyforge,創建一個事務時創建了一個PlaceboTransaction,而另一個事務已經存在。另外:

當完成方法被調用時,這個類將不執行任何操作。完成 只會在'真實'交易完成時調用。

因此,您將獲得一個PlaceboTransaction,因爲您在創建一個Transaction時已經有一個正在運行。一個placeboTransaction對數據庫沒有任何影響,它在「已經運行」的事務完成時被提交。

3

Neo4j不支持嵌套。他們是平坦的。

因此,數據庫指出事務嵌套不受支持。但是,作爲開發者我們可以在事務內部創建另一個事務。

try (Transaction parentTx = db.beginTx()) { 
    try (Transaction childTx = db.beginTx()) { 
    } 
} 

有當TopLevelTransactionPlaceboTransaction進場。

當另一個事務在同一個線程中啓動時,而不是創建新的TopLevelTransaction,數據庫將現有事務包裝爲PlaceboTransaction

PlaceboTransaction將所有方法委託給底層交易。因此,當您撥打success()failure()時,它將被授權到根目錄TopLevelTransaction

該規則的一個例外是close()方法。當你關閉PlaceboTransaction它實際上什麼都不做。以這種方式,您可以安全地close()所有「子女」交易和父母交易將仍然活躍。


注:

  • 使用try-with-resource語法。它在Java7中可用。使用此語法是使用Neo4j事務並確保它們已關閉的安全方法。
  • 總是關閉以前的交易。
  • Neo4j中的事務是線程綁定的。您不能在同一個線程中啓動多個事務。
相關問題