如何跨服务器场实现锁定?

时间:2009-04-23 01:12:47

标签: asp.net mysql locking scalability

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

到目前为止,我正在考虑使用数据库中的表进行同步,例如检查表中项目的id,如果没有exsit插入并继续,否则返回。也许可以使用共享缓存,但我现在还没有使用它。

还有其他方式吗?

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

5 个答案:

答案 0 :(得分:4)

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

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

读取CAP定理可能也不会有害!

答案 1 :(得分:2)

您可能想要调查分布式锁定服务,例如Zookeeper。这是一项Google服务的重新实现,可为应用程序提供非常高速的分布式资源锁定协调。不过,我不知道合并到网络应用程序会有多容易。

答案 2 :(得分:1)

如果所有状态都在(中央)数据库中,那么数据库事务应该为您处理。

请参阅http://en.wikipedia.org/wiki/Transaction_(database)

答案 3 :(得分:0)

拥有一个锁定表是一种简单易行的方法。

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

您还可以将TimeStamp字段与Transactions一起使用,如果自上次获得数据后时间戳已更改,则可以还原事务。因此,如果有人先进入,他们会优先考虑。

答案 4 :(得分:0)

这可能与你无关,因为这个问题很老,但它仍然可能对其他人有用,所以无论如何我都会发布。

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

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

session.Lock(Member, LockMode.Upgrade);