2014-07-22 60 views
3

我已經把一個簡單的測試用例:Neo4j的:事務中刪除節點會導致異常

account = EmailAccount() 
account.email = "[email protected]" 
assert db.account_by_mail("[email protected]") == [] 
db.add_node(account) 
assert db.account_by_mail(account.email) == [account] 
db.delete_node(account)) 
assert db.account_by_mail("[email protected]") == [] 

一切順利,直到最後一行,在拋出一個異常:

Neo.DatabaseError.Statement.ExecutionFailure: Node 226 has been deleted 

聲明由最後一行執行如下:

MATCH (account:Account) WHERE account.email = {mail} RETURN account, id(account), head(labels(account)) 

帶參數

{ 
    'mail': "[email protected]" 
} 

所有的語句都是在同一個事務中執行的(我們使用py2neo Transaction類包裝在會話包裝器中)。該行爲與刪除語義(link here)並不完全一致,因爲該事務尚未提交,並且該語句是讀取而不是寫入。還有其他一些隱藏的限制嗎?這是默認行爲,如果是這樣,它是否可以改變(因爲我認爲大多數其他dbms不這樣做)?

+0

從您的鏈接中:_有可能獲取對已刪除關係或尚未提交的節點的引用。因此,Neo4j找到對226的引用,但由於未提交,因此未找到該節點。 – Hrabal

回答

0

最新版本的py2neo使用惰性方法來節點提交以避免不必要的網絡通信量(請參閱http://py2neo.org/2.0/intro.html#nodes-relationships)。因此,您必須直接將更改提交到圖表才能保留它們。沒有更明確地看到你的數據庫代碼,如果我理解正確,你沒有將事務提交到圖中,因此,你只是簡單地修改尚未保存的對象的狀態。

此行爲與其他orm實現(如SQL Alchemy(python)或Hibernate(Java))保持一致,並緊密映射發生在dbms級別的實際事務劃分。

相關問題