2015-11-27 155 views
1
Transaction beginTx = db.beginTx(); 
try { 
// do update neo4j 
    beginTx.success(); 
    System.println("ok"); 
} catch (Exception ex) { 
} finally { 
beginTx.close(); 
} 

控制台打印“ok”。但我的数据没有保存到neo4j,我发现这个事务是PlaceboTransaction。PlaceboTransaction和TopLevelTransaction之间有什么区别

回答

1

根据rubyforge,创建一个事务时创建了一个PlaceboTransaction,而另一个事务已经存在。另外:

当完成方法被调用时,这个类将不执行任何操作。完成 只会在'真实'交易完成时调用。

因此,您将获得一个PlaceboTransaction,因为您在创建一个Transaction时已经有一个正在运行。一个placeboTransaction对数据库没有任何影响,它在“已经运行”的事务完成时被提交。

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中的事务是线程绑定的。您不能在同一个线程中启动多个事务。
相关问题