我们应该在哪里使用 commit(session),在 try 还是 finally 中?
where should we use commit(session), in try or finally?
如果我想在成功执行数据库操作后使用 commit(session),将它放在 try 或 finally 块中哪个更好?
这里我终于用到了,应该试试吧?
public void delete( --- ) {
Session session = init();
try {
----
} catch (HibernateException e) {
rollback(session);
logger.error("delete failed", e);
throw e;
} finally {
commit(session);
close(session);
}
}
它应该在 try
,原因有二:
- 如果某些异常或错误 other 而不是
HibernateException
,您将 commit
会话,并且您几乎肯定不想这样做
- 您将在调用
rollback
之后调用 commit
。我不记得 Hibernate 是否允许你这样做(通过默默地忽略回滚)但至少它是丑陋的。每个会话都应 提交 或 回滚。
这里的正常解决方案是保留一个单独的 boolean
变量,该变量在您成功提交时设置,并在 finally
中检查,必要时回滚:
boolean committed = false;
try {
// Do stuff
commit(session);
committed = true;
} catch (HibernateException e) {
logger.error("delete failed", e);
throw e;
} finally {
if (!committed) {
rollback(session);
}
// TODO: This won't execute if rollback fails.
// Check whether that's a problem.
close(session);
}
它应该在 try
。 finally
也会在 catch
之后调用。
绝对应该放在try块中。 finally 块通常只用于关闭任何连接。
你需要把它放在 try 块中,否则你将无法识别任何错误并且无法回滚
如果我想在成功执行数据库操作后使用 commit(session),将它放在 try 或 finally 块中哪个更好? 这里我终于用到了,应该试试吧?
public void delete( --- ) {
Session session = init();
try {
----
} catch (HibernateException e) {
rollback(session);
logger.error("delete failed", e);
throw e;
} finally {
commit(session);
close(session);
}
}
它应该在 try
,原因有二:
- 如果某些异常或错误 other 而不是
HibernateException
,您将commit
会话,并且您几乎肯定不想这样做 - 您将在调用
rollback
之后调用commit
。我不记得 Hibernate 是否允许你这样做(通过默默地忽略回滚)但至少它是丑陋的。每个会话都应 提交 或 回滚。
这里的正常解决方案是保留一个单独的 boolean
变量,该变量在您成功提交时设置,并在 finally
中检查,必要时回滚:
boolean committed = false;
try {
// Do stuff
commit(session);
committed = true;
} catch (HibernateException e) {
logger.error("delete failed", e);
throw e;
} finally {
if (!committed) {
rollback(session);
}
// TODO: This won't execute if rollback fails.
// Check whether that's a problem.
close(session);
}
它应该在 try
。 finally
也会在 catch
之后调用。
绝对应该放在try块中。 finally 块通常只用于关闭任何连接。
你需要把它放在 try 块中,否则你将无法识别任何错误并且无法回滚