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

Spring 3 / Hibernate中回滚事务的最佳实践

楚翰
2023-03-14
问题内容

参考Spring文档:

任何RuntimeException都会触发回滚,而任何选中的Exception都不会

引用javapractices.com

未经检查的异常:

  • 表示程序中的缺陷(错误)-通常将无效的参数传递给非私有方法。引用Gosling,Arnold和Holmes的《
    Java编程语言》:“未经检查的运行时异常表示的条件通常可以反映程序逻辑中的错误,并且不能在运行时从中合理地恢复。”
    * 是RuntimeException的子类,通常使用IllegalArgumentException,NullPointerException或IllegalStateException实现

  • 一个方法没有义务为由其实现引发的未经检查的异常建立策略(并且它们几乎总是不这样做)

检查异常:

  • 表示程序无法直接控制的区域中的无效条件(无效的用户输入,数据库问题,网络中断,文件缺失)
  • 是Exception的子类
  • 一个方法必须为由其实现抛出的所有检查的异常建立一个策略(将检查的异常进一步传递到堆栈中,或以某种方式进行处理)

如果在业务逻辑过程中发现问题并且想要回滚更改,是否必须抛出新的RuntimeException?因为我已经在逻辑中识别出它,所以它实际上不是RuntimeException(未经检查的异常)。还是我误解了这些概念?

我的真正问题是 ,在@Transactional服务方法中回滚事务的最佳实践是什么?


问题答案:

如果您使用的是检查异常,则只需将它们添加到注释的rollbackFor属性中@Transactional

@Transactional(rollbackFor = { MyInvalidUserException.class, MyApplicationException.class })
public void method() throws MyInvalidUserException,  MyApplicationException { 
    ... 
    ... 
}

等等

org.life.java的 答案也很好。如果您想将程序化事务管理混入声明性事务中或严格保留声明性事务,这是一个学术决策。



 类似资料:
  • 问题内容: 在Hibernate中,当我在事务中有一个对象,然后回滚它时,保存的对象仍保留在DB中。奇怪,因为使用or 方法不会发生此问题,而只会使用。 这是我正在使用的代码: 这是 HibernateUtil 类(只是涉及的函数,我保证该方法能正常工作- 有一个Interceptor处理程序,但现在不重要了): 谢谢 问题答案: 检查数据库是否支持回滚,即是否使用的是InnoDB表而不是MyIS

  • 我正在尝试创建一个事务方法,该方法调用其他几个事务方法以保存一些相互依赖的db实体。如果任何调用失败,我希望事务完全回滚。但是,这不是观察到的行为。这是我的代码: 也有and,但是当事务在第二次调用时失败时,第一个被提交。

  • 我有一个场景如下 我的问题是,对于一个给定的流,我可能有两个请求同时调用这个方法。我希望methodC抛出乐观锁定失败和回滚事务的异常。 发生的情况如下:R1和R2调用methodA->methodB(启动一个新事务)->methodC(启动一个新事务):两个都读取相同的实体版本,都进行相同的更改并调用merge->methodC完成流回methodB->methodB完成强制事务提交->事务提交

  • 问题内容: 我在EJB3无状态会话Bean中使用CMT。另外,我还创建了自己的具有注释“ @ApplicationException(rollback = true)”的异常。 要回滚事务时是否必须使用“ context.setRollbackOnly()”? 我可以通过在bean的public方法内抛出异常来回滚事务吗? 如果是这样(对Q#2的回答是“是”),我是否必须通过在方法中声明异常来将异

  • 我正在处理一些旧的应用程序代码,其中似乎涉及到几个概念,因此我希望能够将它们改进为一个坚实而严格的实践。 基本上,整个代码都用这样的HibernateSessionRequest estFilter包装 然后,有一个拦截器,做这样的事情 然后还有更多的业务逻辑代码,包括更多的初始事务和会话清除等。 那么,问题是: 当在同一会话中多次调用beginTransaction时会发生什么 非常感谢。