在分布式应用程序中同步数据库访问

Cha*_*l72 5 database language-agnostic mutex distributed-computing

我发现自己经常实现的常见编程逻辑就像下面的伪代码:

Let X = some value
Let Database = some external Database handle

if !Database.contains(X):
   SomeCalculation()
   Database.insert(X)
Run Code Online (Sandbox Code Playgroud)

但是,在多线程程序中,我们在这里有竞争条件.线程A可能会检查是否X存在Database,发现它不存在,然后继续调用SomeCalculation().同时,线程B还将检查是否X存在Database,发现它不存在,并插入重复的条目.

所以当然,这需要同步,如:

Let X = some value
Let Database = some external Database handle

LockMutex()
if !Database.contains(X):
   SomeCalculation()
   Database.insert(X)
UnlockMutex()
Run Code Online (Sandbox Code Playgroud)

这很好,除非应用程序是一个分布式应用程序,运行在多台计算机上,所有这些都与同一个后端数据库机器通信?在这种情况下,Mutex是无用的,因为它只将应用程序的单个实例与其他本地线程同步.为了实现这一目标,我们需要某种"全局"分布式同步技术.(假设简单地禁止重复Database是不可行的策略.)

一般来说,这个问题的一些实际解决方案是什么?

我意识到这个问题非常通用,但我不想让这个问题成为特定于语言的问题,因为这是跨多种语言和多种数据库技术的问题.

我有意避免说明我是在谈论RDBMS还是SQL数据库,而不是NoSQL数据库,因为我再次 - 我正在寻找基于行业惯例的广义答案.例如,这种情况是原子存储过程可能解决的吗?还是原子交易?或者这是否需要像"分布式互斥体"这样的东西?或者更一般地说,这个问题通常是由数据库系统解决的,还是应用程序本身应该处理的?

如果事实证明这个问题在没有进一步信息的情况下根本无法回答,请告诉我,以便我可以对其进行修改.

p.m*_*ino 0

显然,您可以使用特定资源上的排他锁将“同步”部分移至数据库层本身。

我认为这有点极端(在大多数情况下,当您实际发现有人已经插入该行时尝试插入并管理异常)会更合适。