java - Java EE7 回滚事务
问题描述
我知道未经检查的异常(RuntimeExceptions)通常会导致您的事务出现回滚,但是如果您在同一方法中捕获该异常会发生什么?errorOccurred
我希望在is时回滚整个事务true
。但我想知道捕获 Exception 是否会吞噬 RuntimeException 从而导致事务不回滚?此代码是否仍回滚事务?
public static void main(String[] args) {
try {
// boring stuff...
if(errorOccurred)
throw new RuntimeException("RuntimeException is thrown.");
} catch (Exception e) {
System.out.println("RuntimeException cought. Does is still rollback transaction?");
}
}
解决方案
如果您的程序捕获到运行时异常,这意味着异常尚未到达 JEE 容器,因此从 JEE 容器的角度来看,这是正常的程序执行,因此它不会回滚事务。
如果要捕获运行时异常并回滚事务,则需要以编程方式回滚那些特定运行时异常的事务。在会话 bean 中,它提供了具有 setRollbackOnly 方法的 sessioncontext 对象,使用此方法可以通知容器回滚事务而不会引发运行时异常。消息驱动 bean 还提供消息驱动上下文对象,可用于回滚事务[检查 MDB https://docs.oracle.com/javaee/6/tutorial/doc/bnbpo.html]
推荐阅读
- ffmpeg - FFMPEG 流从 sdp 到 youtube/facebook live(RTMP)
- c++ - 自动修改 C++ 代码:将代码从解析树转换回源代码
- xamarin.android - 发送短信到whatsapp xamarin android
- javascript - 如何检查表中是否存在值并返回该行中单元格的值
- amazon-cognito - 在同一个 Cognito 身份池上使用多个 Cognito 池客户端 ID 进行登录
- reactjs - Azure Active Directory 重定向 URI 在 IIS 中部署的 React 应用程序中无法正常工作
- c# - 发布 .NET 项目后如何获取用户路径?
- r - REST API 到 R 中的 stocktwits.com
- vb.net - VB.NET - 我无法管理这个窗口 - Win32 - FindWindowEx
- bash - 使用 awk 按命令/shell(/etc/passwd 的最后一个元素)对用户进行分组