我在EJB3无状态会话Bean中使用CMT。另外,我还创建了自己的具有注释“ @ApplicationException(rollback =
true)”的异常。
要回滚事务时是否必须使用“ context.setRollbackOnly()”?
我可以通过在bean的public方法内抛出异常来回滚事务吗?
如果是这样(对Q#2的回答是“是”),我是否必须通过在方法中声明异常来将异常抛出方法之外,或者仅将异常抛出到方法内部并在同一方法中进行处理就足够了。本身?(我不想将异常传播到下一个级别。我只想回滚该异常。)
提前致谢。;)
首先,没有回滚异常,它是事务的回滚。
@ApplicationException(rollback=true)
,则不必手动回滚事务。Context.setRollbackOnly()
强制容器回滚事务(如果没有例外)。@ApplicationException(rollback=true)
。如果该异常是a RuntimeException
并且未捕获到该异常,则它将强制容器回滚该事务。但是请注意,在这种情况下,容器将丢弃EJB实例。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