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了