Transaction beginTx = db.beginTx();
try {
// do update neo4j
beginTx.success();
System.println("ok");
} catch (Exception ex) {
} finally {
beginTx.close();
}
控制台打印"确定"。但是我的数据没有保存到neo4j,我发现这个事务是PlaceboTransaction。
答案 0 :(得分:3)
Neo4j中的交易不支持嵌套。他们是平的。
因此,数据库声明不支持事务嵌套。但是,作为开发人员,我们可以在交易中创建另一个交易。
try (Transaction parentTx = db.beginTx()) {
try (Transaction childTx = db.beginTx()) {
}
}
有TopLevelTransaction
和PlaceboTransaction
时间。
当在同一个线程中启动另一个事务时,数据库将现有事务包装到TopLevelTransaction
,而不是创建新的PlaceboTransaction
。
PlaceboTransaction
将所有方法委托给基础事务。因此,当您致电success()
或failure()
时,会将其委托给根TopLevelTransaction
。
此规则的一个例外是close()
方法。当你关闭PlaceboTransaction
时它实际上什么也没做。通过这种方式,您可以安全地close()
所有“子”事务和父事务仍将处于活动状态。
注意:
try-with-resource
语法。它在Java7中可用。使用此语法是使用Neo4j事务并确保它们已关闭的安全方法。答案 1 :(得分:1)
根据rubyforge,当您创建一个事务而另一个事务已存在时,会创建一个PlaceboTransaction。也:
调用finish方法时,此类将不执行任何操作。完 只有在“真正的”交易发生时才会被调用。
所以,你得到一个PlaceboTransaction,因为你已经有一个正在运行的事务创建一个事务。对于数据库,placeboTransaction不执行任何操作,当"已经运行时,它会被提交为真实的"交易完成。