我有“交易”表,其中将保存客户帐户交易。所以我想设置事务级别Serialized来防止所有类型的异常。
让我们假设交易是这样进行的:
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
INSERT INTO transaction_test (sum, currency) VALUES (333, '820');
我怀疑这个表是否可供用户读取,因为我们的应用程序需要从这个表中运行多个 SELECT 来进行统计?
经过一番谷歌搜索后,我有点困惑:
所以问题是: Transaction 表可以安全地用于 SELECT 查询,同时可以通过 SERIAL 级别隔离的事务进行更改吗?
PostgreSQL 不通过锁定每个潜在冲突的事务来保证
SERIALIZABLE
。相反,它需要特殊的“谓词锁”,它不会阻止任何内容,但会跟踪事务已读取的数据。如果出现可能违反可序列化性的情况,PostgreSQL 将中止其中一个事务并出现序列化错误。
并发只读事务不会被阻止。根据文档的建议,您应该将只读查询包装在SERIALIZABLE READ ONLY
事务中以获得最佳性能。