可序列化隔离级别是否会阻止 Postgres 中的读取查询

问题描述 投票:0回答:1

我有“交易”表,其中将保存客户帐户交易。所以我想设置事务级别Serialized来防止所有类型的异常。

让我们假设交易是这样进行的:

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
INSERT INTO transaction_test (sum, currency) VALUES (333, '820');

我怀疑这个表是否可供用户读取,因为我们的应用程序需要从这个表中运行多个 SELECT 来进行统计?

经过一番谷歌搜索后,我有点困惑:

所以问题是: Transaction 表可以安全地用于 SELECT 查询,同时可以通过 SERIAL 级别隔离的事务进行更改吗?

sql postgresql transactions rdbms
1个回答
0
投票

PostgreSQL 不通过锁定每个潜在冲突的事务来保证

SERIALIZABLE
。相反,它需要特殊的“谓词锁”,它不会阻止任何内容,但会跟踪事务已读取的数据。如果出现可能违反可序列化性的情况,PostgreSQL 将中止其中一个事务并出现序列化错误 并发只读事务不会被阻止。根据

文档

的建议,您应该将只读查询包装在SERIALIZABLE READ ONLY事务中以获得最佳性能。

    

© www.soinside.com 2019 - 2024. All rights reserved.