[英]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.