Java 发生表达式时未回滚Spring事务
我使用Spring3.2并有一些事务。当我遇到异常时,回滚似乎没有完成 我的代码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
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 {...}