2015-11-06 32 views
1

是否可以確定Node是否在交易中?通過方法Node.getGraphDatabase可以獲得GraphDatabaseService是否可以使用Java API確定「Node」是否在Neo4J中的事務中?

我願做這樣的事情:

public class Neo4JHelper { 
    public void setProperty(Node node, String key, Object value) { 
     if(isInTransaction(node) { 
      node.setProperty(key, value); 
     } else { 
      throw new MyOwnException("You are trying to set a node outside a transaction... you suck"); 
     } 
    } 

    private boolean isInTransaction(Node node) { 
     //Something 
    } 
} 

我想這樣做的原因是因爲我想嘗試使用我的Neo4JHelper類交易之外的時候給我的用戶自定義錯誤。

另一種解決方案是,如果有可能以某種方式告訴編譯器,您需要事務來使用方法/類,否則會產生編譯錯誤。

+0

爲什麼要這麼做? – MicTech

+0

@MicTech:因爲我很奇怪。 (我更新了我的問題來解釋)。 –

回答

2

節點不能在事務中,只有當前執行(Thread)可以。

有一個內部的方式來檢查運行的事務:

ThreadToStatementContextBridge txManager = ((GraphDatabaseAPI) graphDB).getDependencyResolver().resolveDependency(ThreadToStatementContextBridge.class); 
    txManager.hasTransaction(); 
3

我對此有幾個不同的看法,我不確定哪一個最有幫助。

點#1是你不需要做這個檢查。如果您嘗試創建任何虛擬節點,並且您不在事務內部,則數據庫將引發異常,指示您不在事務中。所以如果你想檢測這種情況,試着創建一個簡單的測試節點。沒有例外?您正在進行交易。

點#2也許你問是否有一個特定的節點處於事務中。我不知道有什麼辦法可以做到這一點,也許開發人員可以添加一些東西。在事務中,可以在單個節點上獲取讀/寫鎖。因此,如果您有Transaction對象(您的方法沒有),則代理方法可能是確定給定節點上是否存在鎖定。

點#3,雖然我不是100%確定你在做什麼,但你的代碼表明有一種解決這個問題的不同方式,所以你甚至不需要回答這個問題。如果你希望你的用戶得到一個自定義的錯誤,那就試着修改這個屬性 - 如果neo4j拋出一個你不在事務中的異常,那麼你的答案就是這樣。捕獲該異常,然後拋出自定義錯誤。

+0

我想到了_Point#3_替代方案,但是如果我能夠在嘗試做某件事之前檢查自己是否在交易中,我仍然會更喜歡。作爲一個例子,如果我認爲某個變量在我的代碼中可能是'null',那麼我不會在它的周圍放一個try-catch並且捕獲一個'NullPointerException',我會在嘗試使用它之前檢查它是否爲null。但如果它是唯一的方式,我想這就是我將如何做到這一點。我沒有看到_Point#1_和_Point#3_之間的區別,我仍然需要捕獲第一個節點上的異常? _Point#2_不是我的用例。謝謝您的回答! –

+0

點#3與#1類似,關鍵的建議是,如果您以不同的方式解決問題,那麼問題實際上可能會變得沒有實際意義。 – FrobberOfBits

+0

如果我想建一座橋,一艘船不是答案。不管怎樣,謝謝你。 :) –

相關問題