2013-04-30 98 views
1

爲了記錄,我正在使用Neo4j 2.0.0-M02。Neo4j中的嵌套事務

我目前有一種方法,可以在其圖標中存儲的用戶標識爲「User」的節點上搜索節點屬性「id」。這一切都發生在一個事務中,因爲它會自動關閉ResourceIterator。

現在,我想創建兩個用戶之間的關係。我擁有的是他們的用戶名。現在,我顯然希望重用通過其ID搜索用戶的方法。我可以想到三種方法。

第一個是明顯的。用已經存在的方法檢索兩個節點。比調用創建它們之間關係的方法。顯然這也發生在一個事務中,所以這需要三個事務。沒那麼高效。

第二個只是重用創建關係的新方法中的代碼(而不是方法)。這樣,我可以在一次交易中完成所有工作,但是我重複了代碼,這對開發人員來說不是很好的做法。

第三個是在創建關係的新方法的事務中調用現有方法兩次。這樣我的代碼仍然可以重用,但我不確定嵌套事務在Neo4J中是如何工作的。現有方法的交易是否會被忽略,因爲已有交易?這將解決我的問題。

如果不是,我不得不重新考慮我在哪裏管理我的交易。我知道在服務中管理它們通常比在DAO中更好,但是我想將Neo4j的東西放在我的服務類中。

回答

5

第三個選擇是它將如何工作,因爲在neo4j中沒有真正嵌套的事務,而是存在現有外部事務的非常淺的事務,所以實際上沒有開銷。

 
Transaction tx = db.beginTx(); 
try 
{ 
    otherMethod(db); 
    tx.success(); 
} 
finally 
{ 
    tx.finish(); 
} 

private void otherMethod(GraphDatabaseService db) 
{ 
    Transaction tx = db.beginTx(); 
    try 
    { 
     // do some other stuff... 
     tx.success(); 
    } 
    finally 
    { 
     tx.finish(); 
    } 
} 

在上面的示例中,調用otherMethod()可以使用或不使用現有事務。如果一個事務存在,它所執行的操作將在其中進行,但如果沒有現有事務,將會創建一個事務。所以兩者都可以工作。

+0

所以如果在otherMethod中發生錯誤,整個事務將被回滾,對吧? – 2013-05-08 12:37:57

+0

如果已調用tx.failure()或NOT tx.success(),則事務將回滾。所以在這種情況下,是的 – 2013-05-08 12:56:37