开发者社区> 问答> 正文

并发查询出现AccessShareLock和ExclusiveLock

环境:
HikariCP version: java7-2.4.13
JDK version : 1.7.0_79
Database : PostgreSQL 9.4.1
Driver version : 42.1.4.jre7
ORM : mybatis-3.3.1

描述:
1、一个查询SQL耗时2.5s左右(先不考虑SQL优化的问题);
2、开启5个异步线程同时执行此SQL,每个线程各执行一次;
3、数据库连接池用的是HikariCP,连接池初始化后是空的,在有SQL任务时连接池会自动创建新的数据库连接;
4、开始执行多线程任务;
5、可以看到5个SQL的执行日志几乎是同时打印出来,并且程序进入等待状态,大约13s后,5个SQL的执行结果几乎同时打印出来;

问题:
从pg的监控数据中可以发现并发查询时出现了AccessShareLock和ExclusiveLock,而且每个连接都有7个AccessShareLock和1个ExclusiveLock,如何解读这个现象?从以下链接中可以知道对象锁在事务结束时释放,例如在事务中查询表时,表的共享锁需要等到事务结束时释放,但是测试时并未使用事务进行查询,而从监控结果看各查询却是一个串行等待。
https://yq.aliyun.com/articles/8244?spm=a2c4e.11155435.0.0.62fc75b50NTBVE#

__20180309083755

展开
收起
yundun119 2018-03-09 10:19:15 9384 0
2 条回答
写回答
取消 提交回答
  • 没有commit导致的, 有很高的风险。

    2021-01-28 21:38:10
    赞同 展开评论 打赏
  • PostgreSQL你值得拥有。

    题主方便的话,可以贴一下全一点的SQL 语句。不过我这里可以先解释下涉及到的锁的具体含义:

    • AccessShareLock 只是共享读锁,只有需要AccessExclusiveLock锁的语句比如alter table 等才会等待该锁会被释放。
    • ExclusiveLock 这个锁一般是全局资源的排它锁,我猜测是xid 对应的排它锁,保证在该事务之内的查询的锁机制。
    2019-07-17 22:01:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载