我有这个:
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,其中包括其他细节和示例。