繁体   English   中英

分布式锁定

[英]Distributed Locking

我有3个进程(P1,P2和P3),它们分别在不同的计算机上运行。 这些过程共享数据库中的3个表(T1,T2和T3)。 在更新这些表时,我需要一次保持3个表的原子性(要么应修改所有表,要么不修改任何表)。 我的数据库不提供用于一次更新多个表的锁。

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

我可以在数据库中创建一个单独的表充当互斥体。 当任何进程正在运行时,写入1;当进程退出时,写入0。 但是即使有了这种解决方案,当进程1刚刚释放互斥量时,进程2和进程3也可以同时进入关键部分。

我可以使用双锁检查来解决问题。

有没有更简单的解决方案来解决这个问题? 任何库中是否已经有现有的API?

如果您使用存储在数据库中的互斥锁来实现此目的,那么我认为它的效率将会降低。 因为数据库写入比互斥体之类的OS变量要花费更多的时间。

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

仅当其他两个进程成功锁定其表时,才应进行锁定。

该问题不喜欢常规的分布式事务,因为该事务不跨越多个节点或分区。

GridDB的行为类似于MongoDB,后者仅支持单文档级原子。 常用的技术是两阶段提交,有关详细信息,请参阅执行两阶段提交

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM