Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发生表达式时未回滚Spring事务_Java_Spring_Spring Transactions - Fatal编程技术网

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

Java 发生表达式时未回滚Spring事务,java,spring,spring-transactions,Java,Spring,Spring Transactions,我使用Spring3.2并有一些事务。当我遇到异常时,回滚似乎没有完成 我的代码 public class x{ @Transactional public createX(){ try{ ... y.createY(); ... } catch(Exception e){ .... } } } public class y{ @Transactional public createY(){ ... c

我使用Spring3.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();
}
}

基本上,我有一个类X,createX方法启动事务。它叫createY,谁叫callYY。 在这个方法中,会发生异常。 我当时在想,自从createX被回滚以来,所有的持久性操作都会被回滚,但这并不是谁发生的

我在日志中没有看到事务信息


任何想法都可以尝试定义导致回滚的异常,例如:

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

你从没提过你的交易经理。您需要在应用程序上下文xml中定义事务管理器

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

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

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

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


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

这非常简单。在方法createX中捕获异常。若要回滚,则无法捕获事务中的异常。要回滚事务,您必须抛出不带catch的异常。

还需要支持事务的表。默认情况下,只有未检查的异常才会导致回滚(即
运行时异常
错误
s不
异常
s。接下来,您将捕获异常,该异常也会破坏正常的tx管理,因为Spring不再看到它。因此,不要捕获并抛出
运行时异常
或在
@Transactional
上定义
rollboor
属性。我的exception扩展了RuntimeException发布了一些代码,这些代码将您的代码反映为
新异常
,但并没有表达这一点。但无论如何,您不应该尝试/捕获和吞咽异常,因为这会破坏正确的tx支持。在日志中,我没有看到任何创建的事务,不认为这是正常的。我有一个带有此注释的类:@EnableTransActionManagement or我还可以添加注释,我认为Rollbackbor=使用此注释,我可以保留try catch?是的,但我相信您应该尝试..捕获您的方法
createX
而不是
createY
。现在当抛出
createY
中的异常时,它会在
createX
中捕获,并且不会从
createX
中回滚od发生
<bean id="txManager"
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>
</bean>
@Configuration
@EnableTransactionManagement()
public class MyConfiguration {...}