我试图了解可重复读取隔离级别是否足以满足我在使用 Postgres 的应用程序中的场景,但文档使得很难理解哪个最适合。
我有一个应用程序启动一个事务,该事务首先根据单行的主键读取该行的当前值,在从消息队列接收到事件后计算该行的新状态应该是什么,然后更新数据库中该行的状态。
假定部署了应用程序的多个实例,并且可以同时接收到同一个主键的消息队列上的多个事件,则有可能有 2 个事务可能会尝试同时进入上述事务。对于这种情况,隔离是否repeatable read足够好,或者我是否需要考虑使用serializable?我的假设是,如果第一个事务尝试将其结果提交到数据库,而第二个事务正在进行中,则第二个事务将因冲突而失败,因为它发现它尝试更新的行已被第一个事务修改 -它是否正确?
还有一个后续问题:我想了解使用可序列化事务隔离与可重复读取相比“昂贵”多少 - 我想了解 postgres 内发生的情况的底层机制 - 即是否存在锁定,这对同时运行的其他查询的性能有何影响?