繁体   English   中英

Postgres:为单个表或单个读取选择较弱的事务隔离保证?

[英]Postgres: Opting in to weaker transaction isolation guarantees for a single table or a single read?

我正在编写一个以 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条目时,我们可能会导致global_flags事务的“序列化失败”错误增加。 有没有办法告诉 Postgres 我不需要对global_flags表的读取提供如此强的一致性保证?

你不必担心。

如果一个事务除了改变那个标志什么都不做,而另一个只是读取表(并且不尝试写入它!),这两个事务将具有简单的 RW 或 WR 依赖关系,并且将有没有导致序列化错误的循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM