首页 > 解决方案 > postgresql db 表锁定或行锁定多查询执行

问题描述

我想了解 postgreSQL 是如何执行多查询的,例如我有一个数据库,其中有很多插入查询运行,例如每分钟 20-40 和很多选择查询,如每分钟 200-300(通过主键进行简单查询选择)。

这种类型的查询在同一张表上运行,我很好奇 postgreSQL 是如何处理这些的。是否就像当插入查询运行时表被锁定并且我们必须等待选择查询或者它是行锁定以便在插入查询正在进行时选择查询可以继续并忽略锁定的行?

在 mysql 数据库中,我猜有执行表锁定的 MyISAM 引擎和执行行锁定的 innoDB...

标签: databasepostgresqlrowlockingtable-locking

解决方案


Postgres 实现了多版本并发控制(MVCC),这意味着读取器永远不会阻塞写入器,写入器永远不会阻塞读取器。

对于普通的 DML 语句,Postgres 也永远不会使用表锁,因此 SELECT 查询永远不会被您同时运行的任何 INSERT 语句阻塞。

Postgres Wiki包含有关 MVCC 如何在 Postgres 中实现和工作的更详细描述的链接。

如今,基本上每个现代 DBMS 都使用某种 MVCC。Oracle、Firebird 和 DB2 “一直”在使用它。SQL Server 在 SQL Server 2005 中引入了它(尽管它仍然不是默认行为),在 MySQL 中,InnoDB 引擎使用它。


推荐阅读