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