事务中的 PostgreSQL 并发性

PostgreSQL concurrency in transactions

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

假设我有一个非常大的 table (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中选择的另一个查询,会发生什么情况。注意上一个查询开始处的截断 table。

示例:

SELECT * FROM second_table;

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

I mean I would get zero or non-zero records in the second query?

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

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

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