【问题标题】:Request Mutually Exclusive Record请求互斥记录
【发布时间】:2011-10-05 04:05:06
【问题描述】:

我正在使用 C# 开发两种类型的应用程序。一种是 Web 服务,一种是 MVC3 应用程序。

我对两者都有同样的问题。我正在尝试创建一个方法,当请求时,它会返回一个分布式节点的记录来处理。

并发问题会导致这很危险。一旦进程“A”请求处理记录。如果进程“B”在数据库检查记录“A”之前请求一个,它们可能都得到相同的记录,这对这个系统不利。

在网络服务中,我有一个名为“GetRecordToProcess”的网络方法。在一个控制器中也有一个对应的 MVC3 ActionResult 做同样的事情。

注意 Web 服务和 MVC 操作不需要相互排斥。他们实际上是在两个不同的表上工作,但我碰巧在两个不同的项目上遇到了同样的问题。

我有一个使用 Mutex 的工作版本,但是当我调用 Mutex.WaitOne 时,这些进程正在运行我的 CPU 几乎 60%,这是 baaaad。有什么简单的方法可以做到这一点吗?这似乎很明显,这将是一个常见的分布式计算需求,我只是不知道常见的解决方案。

【问题讨论】:

    标签: c# distributed-computing mutual-exclusion


    【解决方案1】:

    后端需要负责解决并发问题。例如,您可以创建一个CheckOut 表来跟踪当前签出记录的人员。

    增强您的网络服务,使其具有返回只读版本记录的GetRecordToRead() 和尝试签出记录的TryGetRecordToWrite()(通过向 CheckOut 表添加新的签出记录)和如果成功则返回记录的可写版本

    【讨论】:

    • 问题是,如果它不成功。这些是同步调用。我可以告诉客户重试,但似乎有一种更优雅的方式,我可以说 GetRecordToWrite 并始终期待记录
    • 如果您首先调用像 TryCheckoutRecord() 这样的方法,这是可能的。如果该调用成功,那么您可以随意调用 GetRecordToWrite() 并始终期待结果
    猜你喜欢
    • 2018-07-13
    • 2011-09-12
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2011-01-06
    • 2016-09-11
    • 2018-02-08
    相关资源
    最近更新 更多