【问题标题】:Java Spring @Transactional method not rolling back when throw exceptionJava Spring @Transactional方法在抛出异常时不回滚
【发布时间】:2016-01-28 09:01:21
【问题描述】:

我的配置代码在这里:

@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时,抛出异常。但是这个活动也被插入到数据库中,而不是回滚。为什么?

【问题讨论】:

  • 数据库是postgres
  • 您是否检查过您的“orderactivityDao”在插入方法中没有强制提交?
  • 尝试将@ComponentScan("com.yourtxpkg") 添加到DataSourceConfig

标签: spring mybatis transactional


【解决方案1】:

我明白了。我将 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};
}

然后一切正常。

【讨论】:

    猜你喜欢
    • 2019-06-30
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2015-02-12
    • 2020-10-18
    • 1970-01-01
    • 2013-05-01
    • 2016-08-05
    相关资源
    最近更新 更多