gpt4 book ai didi

c++ - libpqxx 事务序列化和后果

转载 作者:行者123 更新时间:2023-11-28 02:51:01 29 4
gpt4 key购买 nike

对于我的实现,特定的写入必须批量完成并且没有其他干扰的机会。

我已经told以这种方式进行的两个竞争事务将导致第一个阻塞第二个,第二个可能会在第一个完成后完成,也可能不会完成。

请发布确认这一点的文档。另外,如果第一个事务阻塞,第二个事务究竟会发生什么?它会排队、失败还是某种组合?

如果无法确认,是否应该将此事务的事务隔离级别设置为SERIALIZABLE?如果是这样,如何使用 libpqxx 准备好的语句来完成?

如果事务是序列化的,第二个事务会失败还是要排队直到第一个事务完成?

如果任一失败,如何使用 libpqxx 检测到?

最佳答案

最终防止并发影响的唯一方法是 LOCK TABLE ... IN ACCESS EXCLUSIVE MODE 每个要修改的表。

这意味着您实际上一次只做一件事。如果您不总是以相同的顺序获取锁,它还会导致有趣的死锁问题。

所以通常,您需要做的是弄清楚您希望执行的操作到底是什么,以及它们如何交互。确定您可以容忍哪些并发影响,以及如何防止您不能容忍的并发影响。

目前这个问题过于宽泛,无法有效回答。

选项包括:

  • 独占锁定表。 (这是目前在 PostgreSQL 中进行没有并发问题的多行更新插入的唯一方法)。当心锁升级和锁顺序相关的死锁。

  • 适当使用 SERIALIZABLE 隔离 - 但请记住,您必须能够记录您在交易期间所做的事情,并在交易中止时重试。

  • 谨慎的行级锁定 - SELECT ... FOR UPDATESELECT ... FOR SHARE

  • 适当时“乐观锁定”/乐观并发控制

  • 以对并发操作更友好的方式编写查询。例如,将读取-修改-写入周期替换为就地更新。

关于c++ - libpqxx 事务序列化和后果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23046600/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com