当前位置: 首页 > 知识库问答 >
问题:

JPA中回滚语句和事务的区别

贺博厚
2023-03-14
int executeUpdate() Execute an update or delete statement. 
Returns: the number of entities updated or deleted 
Throws: 
IllegalStateException - if called for a Java Persistence query language SELECT statement or for a criteria query 
TransactionRequiredException - if there is no transaction 
QueryTimeoutException - if the statement execution exceeds 
  the query timeout value set and only the statement is rolled back 
PersistenceException - if the query execution exceeds 
  the query timeout value set and the transaction is rolled back

共有1个答案

娄德运
2023-03-14

[QueryTimeoutException]在查询超时且仅回滚语句时由持久性提供程序引发。如果当前事务处于活动状态,则不会将其标记为回滚。[QueryTimeoutException]

QueryTimeoutException是PersistenceException的专门化。

[PersistenceException]在出现问题时由持久性提供程序引发。除了NoResultException、NonUniqueResultException、LockTimeoutException和QueryTimeoutException的实例之外,所有PersistenceException的实例都将导致当前事务(如果一个事务处于活动状态并且持久性上下文已加入其中)标记为回滚。[PersistenceException]

catch(PersistenceException e) { ... tx.rollback(); ... }

但有时,即使语句不成功,并且出现QueryTimeoutException,继续事务也是有意义的。

一个示例场景是语句执行期间的超时,该语句只保留一个额外的日志记录。根据您的用例,执行log语句的超时可能不是关键的,否则,如果核心业务流程例如持久化订单超时,则是关键的。因此,您不希望failed log语句会影响订单的持久化。另一方面,如果订单的持久化失败,则日志记录的持久化应该回滚。因此,您可以始终决定哪个查询超时应该导致回滚。

一个示意性的例子是

...
try {
    ...
    queryNonCritical.execute(...);
}
catch(QueryTimeoutException e) {
    // not critical move on
    ...
}
...
try {
    ...
    queryCritical.execute(...);
}
catch(QueryTimeoutException e) {
    ...
    tx.rollback();
    ...
}
...
 类似资料:
  • 我有一个由Spring框架维护的对象,我使用注释将它注入到我想要的任何DAO类中,如下所示。 我使用那些DAO类在数据库中保存如下内容。 现在,这里的两个DAO都使用了通过注入的相同的。现在,如果在之后发生异常,那么我甚至希望回滚保存的实体。但是,如何从中获取? 如果所有DAO都持有相同的对象,那么我可以直接调用类的方法吗?返回新事务或当前与关联的任何事务吗?

  • 问题内容: 调用的方法: 1. Struts Action 2.服务类方法(由@Transactional注释) 3. Xfire Web服务调用 包括struts(DelegatingActionProxy)和事务在内的所有内容都使用Spring进行配置。 持久性是通过JPA / Hibernate完成的。 有时,Web服务将引发未经检查的异常。我捕获了此异常并抛出了一个已检查的异常。我不希望事

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

  • 如果另一个客户机在我们调用watch之后更改了powerlevel的值,我们的事务将失败。如果没有客户端更改该值,则该集合将工作。我们可以在循环中执行这段代码,直到它起作用为止。 为什么不能在不能被其他命令打断的事务中执行增量?为什么我们需要迭代而不是等到没有人改变值才开始事务?

  • 在我的项目中,我将Hibernate与Spring和JPA结合使用。代码在服务层使用注释驱动的事务(使用@Transactional注释支持事务)。事务管理器是org.springframework.orm.hibernate4.HibernateTransactionManager。当任何@Transactional注释方法中发生异常时,当前事务将自动回滚。 我想知道如果我想在事务回滚时记录异常

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