首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分布式锁定

分布式锁定
EN

Stack Overflow用户
提问于 2018-01-23 13:18:05
回答 2查看 558关注 0票数 1

我有3个进程(P1、P2和P3),每个进程都在不同的机器上运行。这些进程在数据库中共享3个表(T1、T2和T3)。在更新这些表时,我需要一次维护3个表的原子性(要么修改所有表,要么不修改任何表)。我的数据库不提供一次更新多个表的锁。

如何有效地执行此操作?这个问题的常用解决方案是什么?

我可以在数据库中创建一个单独的表来充当互斥。当任何进程正在运行时写入1,当进程退出时写入0。但是,即使使用这种解决方案,当进程1刚刚释放互斥时,进程2和进程3也可以同时进入临界区。

我可以使用双重锁定检查来解决这个问题。

这个问题有没有更简单的解决方案?库中有没有已经存在的API?

EN

回答 2

Stack Overflow用户

发布于 2018-01-23 15:48:20

如果你使用存储在db中的互斥来实现这一点,在我看来效率会更低。因为数据库写入比操作系统变量(如Mutexes )花费更多时间。

如果您是从客户端实现的,并且可以与客户端进程通信,则可以为每个进程的表创建独立的互斥锁。并实现你的互斥锁函数来锁定你的表编辑,在剩余的进程中向其他2个表发送锁定消息。

只有当另外两个进程成功地锁定了它们的表时,才应该进行锁定。

票数 0
EN

Stack Overflow用户

发布于 2018-03-07 13:53:23

这个问题不像常规的分布式事务,因为事务不会跨越多个节点或分区。

GridDB的行为类似于MongoDB,后者只支持单文档级原子。一种常用的技术是两阶段提交,您可以参考Perform Two Phase commits了解详细信息

请注意,两阶段提交只能提供类似事务的语义。在两阶段提交或回滚期间,应用程序可以在中间点返回中间数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48394701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档