PlaceboTransaction和TopLevelTransaction之间的区别是什么?

时间:2015-11-27 11:19:35

标签: neo4j

Transaction beginTx = db.beginTx();
try {
 // do update neo4j
  beginTx.success();
  System.println("ok");
} catch (Exception ex) {
} finally {
 beginTx.close();
}

控制台打印"确定"。但是我的数据没有保存到neo4j,我发现这个事务是PlaceboTransaction。

2 个答案:

答案 0 :(得分: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中的事务是线程绑定的。您无法在同一个线程中启动多个事务。

答案 1 :(得分:1)

根据rubyforge,当您创建一个事务而另一个事务已存在时,会创建一个PlaceboTransaction。也:

  

调用finish方法时,此类将不执行任何操作。完   只有在“真正的”交易发生时才会被调用。

所以,你得到一个PlaceboTransaction,因为你已经有一个正在运行的事务创建一个事务。对于数据库,placeboTransaction不执行任何操作,当"已经运行时,它会被提交为真实的"交易完成。