Java Spring @Transactional 方法在抛出异常时不回滚
Java Spring @Transactional method not rolling back when throw exception
我的配置代码在这里:
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@PropertySource(value="classpath:datasource.properties")
public class DataSourceConfig {
@Autowired private Environment env;
@Bean(destroyMethod="close")
public BasicDataSource dataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(env.getProperty("db.driverClass"));
ds.setUrl(env.getProperty("db.url"));
ds.setUsername(env.getProperty("db.username"));
ds.setPassword(env.getProperty("db.password"));
ds.setInitialSize(Integer.valueOf(env.getProperty("db.initialSize")));
return ds;
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
@Transactional 方法:
@Override
@Transactional
public void create(String orderid, String type, String userid,
String comment) throws Exception {
log.info("### orderid={}, type={}, userid={}, comment={}",
orderid, type, userid, comment);
OrderActivity orderActivity = new OrderActivity();
orderActivity.setActivityid(SeqUtil.produceOrderActivityid());
orderActivity.setComment(comment);
orderActivity.setOperator(userid);
orderActivity.setOrderid(orderid);
orderActivity.setType(type);
orderactivityDao.insert(orderActivity);
//FIXME just for test
if(OrderConstant.ACTIVITY_CANCEL.equals(type)){
throw new RuntimeException();
}
log.info("###orderActivity=[{}]", orderActivity);
}
方法create中,当type为ACTIVITY_CANCEL时,则抛出异常。但是这个 activity 也是被插入到数据库中,而不是回滚。为什么?
我明白了。我将 AppConfig 和 b 放在 DataSourceConfig 不同的上下文中。更改代码如下:
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] {AppConfig.class, DataSourceConfig.class, MybatisConfig.class, SecurityConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { MCVConfig.class};
}
那一切就ok了
我的配置代码在这里:
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@PropertySource(value="classpath:datasource.properties")
public class DataSourceConfig {
@Autowired private Environment env;
@Bean(destroyMethod="close")
public BasicDataSource dataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(env.getProperty("db.driverClass"));
ds.setUrl(env.getProperty("db.url"));
ds.setUsername(env.getProperty("db.username"));
ds.setPassword(env.getProperty("db.password"));
ds.setInitialSize(Integer.valueOf(env.getProperty("db.initialSize")));
return ds;
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
@Transactional 方法:
@Override
@Transactional
public void create(String orderid, String type, String userid,
String comment) throws Exception {
log.info("### orderid={}, type={}, userid={}, comment={}",
orderid, type, userid, comment);
OrderActivity orderActivity = new OrderActivity();
orderActivity.setActivityid(SeqUtil.produceOrderActivityid());
orderActivity.setComment(comment);
orderActivity.setOperator(userid);
orderActivity.setOrderid(orderid);
orderActivity.setType(type);
orderactivityDao.insert(orderActivity);
//FIXME just for test
if(OrderConstant.ACTIVITY_CANCEL.equals(type)){
throw new RuntimeException();
}
log.info("###orderActivity=[{}]", orderActivity);
}
方法create中,当type为ACTIVITY_CANCEL时,则抛出异常。但是这个 activity 也是被插入到数据库中,而不是回滚。为什么?
我明白了。我将 AppConfig 和 b 放在 DataSourceConfig 不同的上下文中。更改代码如下:
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] {AppConfig.class, DataSourceConfig.class, MybatisConfig.class, SecurityConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { MCVConfig.class};
}
那一切就ok了