EJB3事务回滚

ruw*_*era 30 java transactions rollback java-ee ejb-3.0

我在EJB3无状态会话bean中使用CMT.我也创建了自己的Exception,其注释为"@ApplicationException(rollback = true)".

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

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

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

提前致谢.;)

Ste*_*eve 69

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

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

有关更多信息,请查看免费的Mastering EJB一书.它很好地描述了回滚场景,可以免费下载.

  • 对我来说似乎异常不好的行为,如果有一个例外,IMO显然应该有回滚!! 有人知道为什么会这样吗? (3认同)
  • @EmmanuelTouzery:Checked Exceptions是方法签名的一部分,因此被视为"预期"和非错误行为.现在,有些人使用已检查的异常作为方法的常规响应,而不是返回值.例如,它可以包含有关业务案例结果的信息.这就是为什么检查Exceptions默认情况下不回滚事务(是签名的一部分),但RuntimeExceptions(不是签名的一部分). (3认同)
  • 我只是出于类似的原因查看这个答案,并想指出您链接到的这本书不再在该站点上提供完整内容,它是 2006 年的,所以它已经过时了,在 JEE5 和中可能没有多大用处JEE6 上下文。 (2认同)