簡體   English   中英

Spring事務不會在@Transactional方法中的RuntimeException回滾

[英]Spring Transaction doesn't Rollback at RuntimeException in @Transactional method

我有此數據庫配置:

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = "com.mycompany")
public class DBConfiguration {

    @Bean(destroyMethod = "close")
    public javax.sql.DataSource dataSource() {
        DataSource ds = new DataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost/v2");
        ds.setUsername("java");
        ds.setPassword("mypass");
        ds.setInitialSize(5);
        ds.setMaxActive(10);
        ds.setMaxIdle(5);
        ds.setMinIdle(2);
        ds.setRemoveAbandoned(true);
        ds.setLogAbandoned(true);
        return ds;
    }

    @Bean
    public DataSourceTransactionManager txManager()
    {
        DataSourceTransactionManager tx= new DataSourceTransactionManager(dataSource());
        return tx;
    }

}

問題已更新

我在理解@Transaction注釋的工作方式時遇到了一些麻煩,請考慮以下情形:

@Service
public class FirstService {
    @Transactional  //<--- this annotation seems to be mandatory for my rollback but I don't want it.
    public void test() throws Exception{
        secondService.insert();
    }
}

@Service
public class SecondService {
    @Transactional //<-- I would like to have only this method in transaction
    protected void insert() throws Exception{
        dao.insertEntity(new Entity()); //<<--- this is an SQL insert command
        throw new RuntimeException("Rollback test");
    }
}

測試代碼:

@RequestMapping("/test") @ResponseBody
    public void test() throws Exception{
        firstService.test();
    }

道:

public void insertEntity(Entity e) {
        getJdbcTemplate().update(SQL_INSERT,e.getCode(),e.getName());       
    }

此測試有效,拋出異常可能回滾事務。

如果我在firstService上省略了@Transaction注釋,為什么沒有回滾?

似乎從@Controller到@ Service,txmanager尋找@Transaction注解,從@Service到(另一個)@Service或@Component,它沒有尋找它。

這對我有用:

@Bean(name = "transactionManager")
    @Primary
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

請更新春季版本,並可能更新一些日志或調試日志,然后查看事務是否存在問題

有兩個錯誤。

第一個錯誤是我無法在同一個對象中嵌套兩個方法(第一個不是事務性的,第二個事務性的),然后我不得不將其分離為兩個對象(如您在更新的問題中所看到的)。

第二個錯誤是@Transaction注釋shuold應該應用於公共方法而不是私有方法或受保護方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM