Java Neo4j事务:我如何访问在catch块中try-header中声明的事务?



我有这个:

try(Transaction t = sess.beginTransaction()){
// do something with t...
} catch (Exception e) {  // abort transaction if something goes wrong
...
t.rollback();
t.close();
}
但是,t不在catch块的作用域中。我在这里回顾了Java/c#中的try/catch作用域。

在try-catch块之前声明t不起作用,因为try中的语法要求在那里声明变量。

是否有任何方法可以像这样初始化t,并且仍然确保事务关闭/回滚?或者我应该在try/catch块之前开始事务?

编辑:事务是' autocloseable '。这是否意味着我不需要显式地处理回滚和关闭?

尝试在尝试之前将Transaction初始化为默认值,它可能会工作

"如何在catch块中访问try-header中声明的事务?">

你不能。使用"try-with-resources"在许多情况下都很方便,但不允许访问try块内的底层资源(数据库事务)。

相反,如果您想直接控制资源,则需要编写如下代码。它与你的方法不同,因为它没有使用自动的"用资源尝试"。声明。另外,请注意t.close()位于finally块中(而不是catch块)—无论是否抛出异常,您都应该始终尝试关闭事务。

Transaction t = session.beginTransaction();
try {
t.run("...");
t.commit();
} catch (Exception e) {
t.rollback();
} finally {
t.close();
}

此外,根据文档,如果您的catch块要在您的try-with-resources尝试中运行,资源(您的事务)将在运行catch块中的代码之前已经关闭:

在try-with-resources语句中,任何catch或finally块都在声明的资源关闭后运行。

以上来自https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html,其中包括其他细节和示例。

最新更新