事务中的 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 的状态。
我想了解事务在 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 的状态。