java - EJB3 事务回滚

标签 java jakarta-ee transactions ejb-3.0 rollback

我在 EJB3 无状态 session bean 中使用 CMT。我还创建了自己的异常,带有注释“@ApplicationException (rollback=true)”。

  1. 当我想回滚事务时,是否必须使用“context.setRollbackOnly()”?

  2. 我可以通过在 bean 的公共(public)方法中抛出异常来回滚事务吗?

  3. 如果是这样(Q#2 的答案是肯定的)我是否必须通过在方法中声明异常来将异常从方法中抛出,或者只在方法中抛出异常就足够了?在同一方法本身内处理它? (我不想将异常传播到下一个级别。我只想回滚异常。)

提前致谢。 ;)

最佳答案

首先,没有异常回滚,它是事务的回滚。

  1. 如果您使用 @ApplicationException(rollback=true) 抛出异常,则无需手动回滚事务。 Context.setRollbackOnly() 强制容器回滚事务,如果没有异常也是如此。
  2. 已检查异常本身不会回滚事务。它需要有注解@ApplicationException(rollback=true)。如果异常是 RuntimeException 并且没有捕获到异常,它会强制容器回滚事务。但请注意,在这种情况下,容器将丢弃 EJB 实例。
  3. 如2.)所述,如果抛出RuntimeException,事务将自动回滚。如果您在代码中捕获到已检查的异常,则必须使用 setRollbackOnly 来回滚事务。

如需更多信息,请查看免费书籍 Mastering EJB .它很好地描述了回滚场景并且免费提供给 download .

关于java - EJB3 事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2360764/

相关文章:

java - 如何在数组中添加 40 以下的数字

java - JPA 查询异常意外(

sql-server-2005 - 将选择语句包含在事务中有什么意义?

sql-server - 什么是金融操作中的锁定、死锁问题?

java - 在 Java 中,当文件被其他线程锁定时,有没有办法读取该文件?

java - 按位运算符的澄清

java - Spring Boot - .bash_profile 的 application.properties 中的 JAVA_OPTS?

java - eclipse 在完成方法的全名之前自动完成

java - jsp与hibernate、spring集成的错误

Spring 事务管理器 : Rollback doesnt work