有哪些方法可以处理 RDBMS 上无状态服务器之间的竞争条件?
What are some methods of dealing with race conditions between stateless servers on a RDBMS?
我们现在想避免使用 zookeeper,这样我们就没有太多活动部件了。我们可能会稍后添加它。现在,我想知道如何处理
上的竞争条件
- 插入
- 更新
对于更新,我们可以使用乐观锁定(在 table 中有一个版本列)。两次插入完全失败。通过这种方式,我怀疑我可以寻找两种异常类型并重试以防止任何竞争条件。在高负载下,我们在某些记录中的重试可能会进行 3 次尝试以获取记录(我认为)。
无论如何,我想知道其他人如何处理 RDBMS 上大型服务器集群之间的竞争条件?我正在寻找可能更好的解决方案或只是让我思考可以围绕这些类型的问题做的不同事情的简单解决方案。
我记得在 noSQL 中,它 returns 刚刚被替换的行而不是异常,所以你知道可以这么说,并且可以在需要时处理它。
如果您预计会有很多冲突,请使用悲观锁定:
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
事务隔离级别使用乐观锁定。
我们现在想避免使用 zookeeper,这样我们就没有太多活动部件了。我们可能会稍后添加它。现在,我想知道如何处理
上的竞争条件- 插入
- 更新
对于更新,我们可以使用乐观锁定(在 table 中有一个版本列)。两次插入完全失败。通过这种方式,我怀疑我可以寻找两种异常类型并重试以防止任何竞争条件。在高负载下,我们在某些记录中的重试可能会进行 3 次尝试以获取记录(我认为)。
无论如何,我想知道其他人如何处理 RDBMS 上大型服务器集群之间的竞争条件?我正在寻找可能更好的解决方案或只是让我思考可以围绕这些类型的问题做的不同事情的简单解决方案。
我记得在 noSQL 中,它 returns 刚刚被替换的行而不是异常,所以你知道可以这么说,并且可以在需要时处理它。
如果您预计会有很多冲突,请使用悲观锁定:
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
事务隔离级别使用乐观锁定。