使用shardingjdbc本地事务,数据正常插入数据库,但是在最后释放资源的时候报错No value for key [当前数据源] bound to thread,导致接下来的业务流程无法执行。这个问题不是百分百出现的,只是偶发现象。
我的业务方法及事务使用如下:
@Transactional(rollbackFor = Exception.class)
@ShardingTransactionType(TransactionType.LOCAL)
public void insertInfo(){
//保存第一张表数据
//保存第二张表数据
}
查看堆栈发现是在commit之后清理资源的unbindResource
这个方法中根据key获取不到value报错:
TransactionSynchronizationManager.unbindResource(TransactionSynchronizationManager.java:213)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doCleanupAfterCompletion(DataSourceTransactionManager.java:367)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1007)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:793)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:714)
public static Object unbindResource(Object key) throws IllegalStateException {
Object actualKey = TransactionSynchronizationUtils.unwrapResourceIfNecessary(key);
Object value = doUnbindResource(actualKey);
if (value == null) {
throw new IllegalStateException(
"No value for key [" + actualKey + "] bound to thread [" + Thread.currentThread().getName() + "]");
}
return value;
}
项目中用到了shardingjdbc做分库操作,该业务方法数据只会进入同一个库中, 盼解答,感谢。