事务中的PostgreSQL并发

问题描述

我想了解事务在 sql 中是如何工作的,特别是在 Postgresql

假设我有一个非常大的表 (first_table),下面的查询持续 2 秒,我通过 psql 执行下面的查询

sudo -u postgres psql -f database/query.sql

这是查询

TruncATE TABLE second_table;

INSERT INTO second_table (
    foo1,foo2 
) 
SELECT foo1,foo2
FROM first_table;

如果我在执行前一个查询的同时执行另一个从 second_table 中选择的查询会发生什么。注意上一个查询开始处的截断表。

示例:

SELECT * FROM second_table;

编辑:我的意思是我会在第二个查询中得到零或非零记录?

解决方法

我的意思是我会在第二个查询中得到零或非零记录?

在合理的事务隔离级别下,数据库不允许脏读,这意味着没有事务可以看到尚未提交的其他事务的更改。 (在 Postgresql 中,它甚至不是关闭它的选项,在我的书中这是一个非常明智的选择)。

这意味着第二个查询要么在 TRUNCATE 之前看到表的内容,要么在 TRUNCATE 之后看到添加的新记录。但是它不会看到介于两者之间的东西,即它不会得到一个空表(假设在 TRUNCATE 之前表中有记录)并且它不会看到新记录的不完整一半(甚至是奇怪的组合)。

如果您说第二个查询在第一个查询提交之前返回,那么它会在应用第一个查询的任何更改之前看到表的状态。