我使用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会被回滚,但不是那个发生的人
我在日志中看不到交易信息
任何想法
答案 0 :(得分:1)
尝试定义导致回滚的异常,例如:
@Transactional(rollbackFor = {Throwable.class, Exception.class})
答案 1 :(得分:1)
Propagation.REQUIRED
(默认值)表示在打开事务的情况下不会打开任何事务。
这意味着事务在调用x.createX
方法时实际打开,并且在调用y.callY
和y.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 {...}