小编典典

@PostConstruct方法上的@Transactional

spring

我想在应用程序开始时阅读文本数据装置(CSV文件),并将其放入数据库中。

为此,我创建了带有初始化方法(@PostConstruct批注)的PopulationService。

我也希望它们在单个事务中执行,因此我在同一方法上添加了@Transactional。

然而,@Transactional似乎被忽略:该交易启动/停止我的低水平DAO方法。

那我需要手动管理交易吗?


阅读 910

收藏
2020-04-11

共1个答案

小编典典

我想在应用程序开始时阅读文本数据装置(CSV文件),并将其放入数据库中。

为此,我创建了带有初始化方法(@PostConstruct批注)的PopulationService。

我也希望它们在单个事务中执行,因此我在同一方法上添加了@Transactional。

然而,@Transactional似乎被忽略:该交易启动/停止我的低水平DAO方法。

那我需要手动管理交易吗?在@PostConstruct中(与InitializingBean接口中的afterPropertiesSet一样),无法确保已完成所有后期处理,因此(实际上)不能有任何事务。确保工作正常的唯一方法是使用TransactionTemplate。

因此,如果你希望·在事务中执行某些操作,则必须执行以下操作:

@Service("something")
public class Something {

    @Autowired
    @Qualifier("transactionManager")
    protected PlatformTransactionManager txManager;

    @PostConstruct
    private void init(){
        TransactionTemplate tmpl = new TransactionTemplate(txManager);
        tmpl.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                //PUT YOUR CALL TO SERVICE HERE
            }
        });
   }
}
2020-04-12