2009-04-23 58 views
4

是否有众所周知的在服务器场中同步任务的最佳实践?例如,如果我在服务器场上运行基于论坛的网站,并且有两个主持人尝试执行某些操作,而这些操作需要写入数据库中的多个表,并且这些主持人的请求正由服务器中的不同服务器处理农场,如何实现一些锁定功能以确保他们不能同时对同一项目执行该操作?如何实现跨服务器场的锁定?

到目前为止,我在考虑使用数据库中的表来同步,例如,检查表中项目的ID,如果不存在,插入并继续,否则返回。也可能是一个共享缓存可用于此,但我目前没有使用这个。

还有其他方法吗?

顺便说一句,我使用MySQL作为我的数据库后端。

+0

有多个请求响应试图同时访问数据库服务器。他们在不同的服务器上并没有太大的改变。 – jfclavette 2009-04-23 01:17:11

+0

确定,但它们同时影响多个记录,我不希望在第一个请求仍在执行时影响相同记录的另一个请求。简而言之,我想在C#中使用类似lock的关键字,但希望它以分布式方式工作。 – 2009-04-23 01:22:06

回答

2

您可能要调查一个分布式锁定服务,如Zookeeper。这是Google服务的重新实现,为应用程序提供非常高速的分布式资源锁定协调。不过,我不知道如何将它融入到网络应用程序中。

0

拥有一个锁表是一个好方法,它很简单并且可行。

您也可以将代码作为单个服务器上的服务使用,而不是SOA方法。

如果自上次获取数据后时间戳发生变化,您可以使用事务处理的TimeStamp字段来恢复事务。所以如果有人先获得优先权。

4

您的问题意味着数据级并发控制 - 在这种情况下,请使用RDBMS的并发控制机制。

如果稍后您希望控制不必将数据实体映射到一个数据实体(例如表记录访问)的应用程序级别的操作,则无法为您提供帮助。通用的解决方案是一个反向代理服务器,它可以理解应用程序级别的语义,并在需要时进行相应的序列化。 (这会对可用性产生负面影响。)

它也可能不会伤害到读CAP定理!

0

它可能与你无关,因为问题是旧的,但它仍然可能对其他人有用,所以我会发布它。

您可以对锁定对象使用“SELECT FOR UPDATE”数据库查询,因此实际上使用db来实现锁机制。

如果你使用ORM,你也可以这样做。例如,在nhibernate中你可以这样做:

session.Lock(Member, LockMode.Upgrade);