@PostConstruct方法上的@Transactional

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

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

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

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

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

回答:

我想在应用程序开始时阅读文本数据装置(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

}

});

}

}

以上是 @PostConstruct方法上的@Transactional 的全部内容, 来源链接: utcz.com/qa/427924.html

回到顶部