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