postgresql - 在进行长期插入事务时无法执行选择查询
问题描述
我对 PostgreSQL 很陌生,我确定我在这里遗漏了一些东西。该场景是版本 11,使用 nodejs 驱动程序在给定表上执行一个大的删除表和插入事务,这可能需要 30 分钟。这样做时,如果我尝试使用 jdbc 驱动程序在该表上使用 select 进行查询,则查询执行将等待事务完成。如果我关闭事务(通过完成它或强制它退出),jdbc 查询就会响应。
我以为我可以在与另一个连接执行事务时读取具有一个连接的表。我在这里想念什么?我应该保留表格(在交易开始时不删除它)吗?
解决方案
DROP TABLE
对 table进行ACCESS EXCLUSIVE
锁定,这正是为了防止它与 table 上的任何其他操作同时发生。毕竟,DROP TABLE
物理删除表。
由于所有的锁都被持有直到数据库事务结束,所有对被删除表的访问都被阻塞,直到事务结束。
当然这些文件只有在事务提交时才会被删除,所以你可能想知道为什么 PostgreSQL 不允许同时读取并发事务。但这意味着它COMMIT
可能会被并发阅读器阻塞,或者SELECT
可能会在阅读过程中导致系统错误,这两种情况听起来都不吸引人。
推荐阅读
- c# - 使用 MVVM 时未填充 WPF 扩展器标头
- python - If-Else 语句不要求 Python 中的输入
- java - 如何在maven中创建一个jar?
- sql - 具有 OR 条件的 2 个表之间的 SQL 连接
- python - 如何将排序列表分组为该列表连续元素的起点和终点的元组?
- node.js - Lindo(Dofus-touch emulator) "npm-install error" node-sass@4.9.3 postinstall: `node scripts/build.js`
- r - 从文件名列表中提取和匹配集
- jmeter - Jmeter - 缺少参数
- java - 我可以获得初始化我的 bean 的配置类名称吗?
- docker - 使用docker设置tendermint测试网并在abci和tendermint核心之间建立通信