在PostgreSQL中执行单个查询时,数据状态是否保持持久?

6ju8rftf  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(108)

在PostgreSQL中执行单个查询时,数据状态是否保持持久?我有一个问题:

Select * From t1; Select * From SomeSlowView; Select * From t1;

第一个Select是否总是给予与第三个相同的结果?假设另一个查询正在并行运行:

Update t1 Set x = x + 1;

Insert t1 ...;

我可以在第一个查询中得到不同的数据,第一个Select和第三个Select?如果没有,交易可以帮助吗?

Begin;
Select * From t1; Select * From SomeSlowView; Select * From t1;
Commit;

我需要明确地锁定t1吗?

Lock Table t1;
Select * From t1; Select * From SomeSlowView; Select * From t1;
bvjveswy

bvjveswy1#

答案取决于您使用的事务隔离级别。
使用默认的READ COMMITTED隔离级别,t1上的第一个和第二个查询将具有不同的快照,因此它们可以接收不同的结果。
如果使用REPEATABLE READ隔离级别(或更高级别),PostgreSQL将对事务中的所有语句使用相同的快照,因此t1上的两个查询将看到相同的结果。
如果您需要这种一致性,请使用REPEATABLE READ。不锁定表。即使您使用了适当的锁级别(LOCK t1 IN SHARE MODE)而不是像您这样使用ACCESS EXCLUSIVE,该锁也会对并发性造成不良影响,更糟糕的是,它可能会阻止autovacuum清理t1,这可能会导致严重的问题。

相关问题