首页 > 解决方案 > Postgres:为单个表或单个读取选择较弱的事务隔离保证?

问题描述

我正在编写一个以 Postgres 13 作为后端的网络应用程序。大多数请求都使用SERIALIZABLE隔离级别包装在事务中。

对于大多数事情,这很有效。但是,在某些情况下,我希望事务中的某些读取具有不那么严格的隔离。

例如,我要介绍一个global_flags表,用于显示任何请求都可能使用的不经常更改的设置:

await sqlAsync(`BEGIN; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE`);

const batchSize = await sqlAsync(
    `SELECT value FROM global_flags WHERE name = 'batch_size'`);

// ... a bunch more work ...

await sqlAsync('COMMIT');

我有点担心,当我们手动更改global_flags条目时,我们可能会导致进行中事务的“序列化失败”错误增加。有没有办法告诉 Postgres 我不需要为读取global_flags表提供那么强的一致性保证?

标签: postgresql

解决方案


你不必担心。

如果一个事务除了更改该标志之外什么都不做,而另一个只是读取表(并且不尝试写入它!),则两个事务将具有简单的 RW 或 WR 相互依赖,并且会有没有导致序列化错误的周期。


推荐阅读