我有3个进程(P1、P2和P3),每个进程都在不同的机器上运行。这些进程在数据库中共享3个表(T1、T2和T3)。在更新这些表时,我需要一次维护3个表的原子性(要么修改所有表,要么不修改任何表)。我的数据库不提供一次更新多个表的锁。
如何有效地执行此操作?这个问题的常用解决方案是什么?
我可以在数据库中创建一个单独的表来充当互斥。当任何进程正在运行时写入1,当进程退出时写入0。但是,即使使用这种解决方案,当进程1刚刚释放互斥时,进程2和进程3也可以同时进入临界区。
我可以使用双重锁定检查来解决这个问题。
这个问题有没有更简单的解决方案?库中有没有已经存在的API?
发布于 2018-01-23 15:48:20
如果你使用存储在db中的互斥来实现这一点,在我看来效率会更低。因为数据库写入比操作系统变量(如Mutexes )花费更多时间。
如果您是从客户端实现的,并且可以与客户端进程通信,则可以为每个进程的表创建独立的互斥锁。并实现你的互斥锁函数来锁定你的表编辑,在剩余的进程中向其他2个表发送锁定消息。
只有当另外两个进程成功地锁定了它们的表时,才应该进行锁定。
发布于 2018-03-07 13:53:23
这个问题不像常规的分布式事务,因为事务不会跨越多个节点或分区。
GridDB的行为类似于MongoDB,后者只支持单文档级原子。一种常用的技术是两阶段提交,您可以参考Perform Two Phase commits了解详细信息
请注意,两阶段提交只能提供类似事务的语义。在两阶段提交或回滚期间,应用程序可以在中间点返回中间数据。
https://stackoverflow.com/questions/48394701
复制相似问题