我正在尝试为 LDAP 存储库启用事务。我找到了这个 https://docs.spring.io/spring-ldap/reference/transaction-support.html 文档,但它只描述了如何使用 beans.xml 文件启用它。在 Spring Boot 中,你通常没有这个,我不知道如何在 @Configuration 注解的类中以编程方式执行此操作。
以防万一您问:不,默认情况下似乎没有启用。当我调试 @Transactional 带注释的方法时,事务通常似乎正在工作(您知道 TransactionInterceptor、CGLib 以及所有正在使用的内容),但我认为默认情况下这仅处理 Jpa 存储库。我的方法仅由 repo.save 方法和硬编码的 RuntimeException 组成。但预期的回滚仍然没有发生。
更新: 我已经取得了一些进展:所以我想我成功地在 Spring Boot 样式中配置了 ContextSourceAndDataSourceTransactionManager:
@Bean
public TransactionManager transactionManager(DataSource dataSource, ContextSource contextSource) {
var tx = new ContextSourceAndDataSourceTransactionManager();
tx.setDataSource(dataSource);
tx.setContextSource(contextSource);
tx.setRenamingStrategy(new DefaultTempEntryRenamingStrategy());
return tx;
}
当我调试ContextSourceAndDataSourceTransactionManager.doRollback方法时,我可以看到它实际上是在repository.save之后发生运行时异常时执行的。但新实体仍然在 LDAP 中而没有被回滚。
解决了它 - 所以这个配置实际上使它工作:
@Bean
public ContextSource contextSource(LdapContextSource ldapContextSource) {
return new TransactionAwareContextSourceProxy(ldapContextSource);
}
@Bean
public TransactionManager transactionManager(DataSource dataSource, ContextSource contextSource) {
var tx = new ContextSourceAndDataSourceTransactionManager();
tx.setDataSource(dataSource);
tx.setContextSource(contextSource);
tx.setRenamingStrategy(new DefaultTempEntryRenamingStrategy());
return tx;
}