当前位置: 首页 > 面试题库 >

EJB3事务回滚

赖浩荡
2023-03-14
问题内容

我在EJB3无状态会话Bean中使用CMT。另外,我还创建了自己的具有注释“ @ApplicationException(rollback =
true)”的异常。

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

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

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

提前致谢。;)


问题答案:

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

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

有关更多信息,请查阅免费书籍Mastering EJB。它很好地描述了回滚方案,可以免费下载。



 类似资料:
  • 我正在使用spring-test运行JUnit测试,我的代码如下所示 我的问题是我希望我的测试不影响其他测试。所以我想为每个测试创建一些类似回滚的东西。我为此找了很多,但到目前为止一无所获。我使用Hibernate和MySql来实现这个

  • -ZJ 以下是我在Application.Properties中的数据源设置:

  • 我在Spring Boot应用程序中有一个Javers实现。Mongo4.4被用作数据库。从MongoDB4.4开始,您可以在事务中创建文档。 我在创建对象时模拟了一个异常。如预期的那样,对象没有在数据库中创建,但是一个新的快照被添加到jv_snapshots集合中。 控制器:

  • 情景故事时间: 我“继承”了一个程序,一个用于访问数据库的相当简单的webservice。该程序在某个地方有一个缺陷:它试图更新一个没有更新授权的表。该程序只具有更新数据库队列的权限(Oracle),以保存谁访问了什么信息。这是不受欢迎的行为,现在我纠正了它。注意:这与这个问题本身无关,它只是导致我提出这个问题的原因。 该程序使用Spring+Hibernate来管理和访问数据和事务。 因为程序的

  • 你能告诉我如何只对某些代码块运行事务吗?我有@Transactional的服务函数,并从它们调用存储库函数,在那里执行查询。但当查询失败时,由于事务必须结束,服务功能也随之失效。那么,当存储库函数失败时,如何返回null值呢?我需要在失败时捕获空值,并继续一些逻辑。我的代码: 我尝试了@davidxxx的答案,得到了这个错误:

  • 问题内容: 当服务中抛出RuntimeException时,我使用Grail的回滚功能将所有服务更新为事务性。在大多数情况下,我都这样做: 无论如何,我想验证这是否确实会回滚事务……这让我开始思考是否在这一点上已经提交了。此外,如果没有,设置flush:true会改变这一点吗?我对Spring / Hibernate如何完成所有这些工作不是很熟悉:) 问题答案: 是的,那样做。 默认情况下,Gra