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

发生表达式时未回滚Spring事务

陆烨磊
2023-03-14

我使用spring 3.2并有一些事务。当我遇到异常时,回滚似乎没有完成。

我的代码

public class x{

  @Transactional
  public createX(){
  try{
     ...
     y.createY();
     ...
   }
   catch(Exception e){
     ....
   }
 }

}

public class y{
@Transactional
public createY(){
      ...
  callYY();
     ...
}

@Transactional(propagation = Propagation.REQUIRED)
public void callYY(){
  ...
  throw new Exception();
}

}

@Configuration
@EnableTransactionManagement
public class Configuration {
}

基本上,我有一个类X,createX方法启动一个事务。它调用createY谁调用call YY。在这个方法中发生了异常。我在想,那么自createX以来的所有持久操作都将被回滚,但这不是谁发生的

我在日志中没有看到交易信息

任何想法

共有3个答案

丌官绍元
2023-03-14

这很简单。在方法createX中捕获异常。若你们想回滚,你们不能捕捉事务中的异常。要回滚事务,您必须抛出异常而不捕获。

舒阳州
2023-03-14

传播。REQUIRED(默认)表示在打开的事务存在的情况下没有打开任何事务。这意味着在调用x.createX方法时实际打开了事务,而在调用y.callYy.callYY方法时没有执行任何操作(就事务处理而言)。

但是,您捕获了异常,并且它没有到达在x.createX方法上定义的Spring事务拦截器,该方法应该将其转换为回滚。

因此,如果x.createX不必是事务性的,则从其中删除@Transactional将使回滚发生。

伍光济
2023-03-14

尝试定义导致回滚的异常,例如:

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

  • 问题内容: 我在下面使用HIbernate和Spring和JPA。当引发PersistenceException时,我想捕获它并返回错误消息,以便它不会传播到调用者。 但是我得到一个异常,说我需要在异常之后回滚事务,但是当我捕获到异常并且不想重新抛出该异常时,如何回滚它呢? 问题答案: 似乎没有办法回退由Spring ORM管理的失败事务。问题中显示的代码是服务类。将其持久性例程提取到单独的DAO

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

  • 我使用的是Spring3.0.5和Hibernate3.6。在我的项目中,有一个场景,我必须回滚在抛出的任何异常或错误发生的事务。这是示例代码,除了当我抛出异常时事务不会回滚之外,一切都很好,但是如果抛出任何异常,比如mysql.IntegrityConstraintException,那么事务会回滚,为什么在我的情况下没有发生这种情况? hibernate.cfg 因此,正如我所说,我的问题是,

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