@Transactional注解timeoutString属性在Repository接口中不生效问题
为什么@Transactional的timeoutString属性在Spring Data Repository接口上不生效?
我尝试为部分Repository操作配置动态可调整的事务超时时间,但该配置未生效。示例Repository代码如下:
@Repository public interface TransactionRepository extends CrudRepository<Transaction, BigInteger> { @Override @Nonnull @Transactional(timeoutString = "${db.transaction.batchTimeoutSecs}") <S extends Transaction> Iterable<S> saveAll(@Nonnull Iterable<S> entities); }
db.transaction.batchTimeoutSecs属性已在application.yml中定义。但将@Transactional注解放在Service方法上时则可正常工作,示例Service代码如下:
@Override @Transactional(transactionManager = "oracleTransactionManager", timeoutString = "${db.transaction.batchTimeoutSecs}") public int applySettlementUpdate(<parameters>...) { ... }
此时属性注入正常,无报错。但调用上述Repository的saveAll方法时会抛出异常,根因如下:
java.lang.IllegalArgumentException: Invalid timeoutString value "${db.transaction.batchTimeoutSecs}" - cannot parse into int
我了解全局事务超时配置方式,目前正通过db.transaction.timeoutSecs进行全局配置,但需要为特定操作覆盖全局配置,因此使用@Transactional的timeoutString属性。若该属性仅在Service方法生效而在Repository方法不生效,我需重构代码单独创建服务类处理这些操作,但我不想这么做,也不理解为何Repository上不生效。
内容的提问来源于stack exchange,提问作者Mike Brennan
相关产品推荐
相关产品推荐

