walkmiss 2022-01-15 18:21 采纳率: 0%
浏览 1232

偶发spring事务无法释放资源No value for key [] bound to thread

使用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做分库操作,该业务方法数据只会进入同一个库中, 盼解答,感谢。
  • 写回答

2条回答 默认 最新

  • a1767028198 2022-01-15 20:06
    关注

    你们是自己改写了什么东西吧,正常情况下当前事务需要提交,提交完以后才会去解除绑定,

    img

    数据源和ConnectionHolder的映射关系,如果是采用容器注入一个数据源,数据源内部自己手动切换到具体的代理数据源的方式,应该是不会出现这种情况的

    img

    评论

报告相同问题?

问题事件

  • 创建了问题 1月15日

悬赏问题

  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了