【问题标题】:What are some methods of dealing with race conditions between stateless servers on a RDBMS?有哪些方法可以处理 RDBMS 上的无状态服务器之间的竞争条件?
【发布时间】:2020-11-06 02:47:27
【问题描述】:

我们现在想避免使用 zookeeper,这样我们就没有太多的活动部件。我们以后可能会添加它。现在,我想知道如何在

  • 插入
  • 更新

对于更新,我们可以使用乐观锁定(表中带有版本列)。两个插入完全失败。通过这种方式,我怀疑我可以查找两种异常类型并重试防止任何竞争条件。在高负载下,我们在某些记录中的重试可能会达到 3 次尝试获取记录(我认为)。

无论如何,我想知道其他人如何处理 RDBMS 上的大型服务器集群之间的竞争条件?我正在寻找可能更好的解决方案,或者只是简单的解决方案,让我思考可以围绕这些类型的问题做的不同事情。

我记得在 noSQL 中,它返回刚刚被替换的行而不是异常,因此您知道可以说存在竞争,并且可以在需要时进行处理。

【问题讨论】:

    标签: mysql postgresql rdbms


    【解决方案1】:

    如果您预计会有很多冲突,请使用悲观锁定

    START TRANSACTION;
    -- will lock the row about to be modified
    SELECT col FROM tab WHERE id = 42 FOR UPDATE;
    /* application activity */
    UPDATE tab SET col = 'newval' WHERE id = 42;
    COMMIT;
    

    如果您预计冲突很少,请使用乐观锁定,或者通过应用程序工具或使用REPEATABLE READ 事务隔离级别。

    【讨论】:

    • 插入@Laurenz Albe 怎么样?这仅适用于现有行,我们经常同时创建行。
    • 插入没有这样的冲突,因为插入始终是原子操作:要么失败,要么有效。没有竞争条件。
    • 所以第二个失败了,我们必须重试,对吗?这就像我们的乐观锁定一样,所以我不确定我们为什么要进行悲观锁定?为什么不像使用乐观锁定的插入一样处理更新?
    • 不,插入失败绝不是竞争条件。如果重试,它会再次失败。那是不同的东西。
    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 2016-11-16
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    相关资源
    最近更新 更多