发生异常时,Spring事务不会回滚

时间:2014-06-05 19:55:13

标签: java spring spring-transactions

我使用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来调用callYY。 在这种方法中发生异常。 我当时正在考虑所有持久性操作,因为createX会被回滚,但不是那个发生的人

我在日志中看不到交易信息

任何想法

4 个答案:

答案 0 :(得分:1)

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

@Transactional(rollbackFor = {Throwable.class, Exception.class})

答案 1 :(得分:1)

Propagation.REQUIRED(默认值)表示在打开事务的情况下不会打开任何事务。 这意味着事务在调用x.createX方法时实际打开,并且在调用y.callYy.callYY方法时没有做任何事情(在事务处理方面)。

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

因此,如果x.createX不必处于交易状态,则从中移除@Transactional将使回滚发生。

答案 2 :(得分:1)

很简单。您在方法createX中捕获异常。如果您想要回滚,则无法在事务中捕获异常。要回滚事务,你必须抛出异常而不用catch。

答案 3 :(得分:-1)

你永远不会提到你的交易经理。您需要在应用程序上下文中定义事务管理器xml ...

<bean id="txManager"
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>
</bean>

或者作为Bean配置类的注释声明...

@Configuration
@EnableTransactionManagement()
public class MyConfiguration {...}