ASP.NET竞争条件

时间:2011-04-10 11:25:23

标签: asp.net locking race-condition

阻止两个不同的人同时执行相同方法的最佳方法是什么?例如,用户A与用户B在同一页面上。两者都按下页面上的按钮,同时执行该事件的代码。我试图让一个等待另一个完成。

有没有通用的方法呢?

这里有更多信息..

这是一个简单的游戏,你可以购买网站的成员(比如FB上的自有游戏)。查询字符串是用户的ID。我有一个问题,两个人同时点击购买。一个得到用户而另一个只是亏钱。因此,我试图阻止在同一时间购买以阻止这种情况发生。

2 个答案:

答案 0 :(得分:5)

将为每个请求创建一个Page实例,因此假设您拥有的逻辑位于实例成员中且不访问任何共享内容,则不需要锁定。

如果点击共享资源,有几种方法可以强制执行锁定。一种方法是使用lock语句,例如

private static someObject = new Object();

public void SomeMethod() 
{
    lock(someObject) 
    {
        // do something with your shared resource.
    }

}

一般来说,您应该尽量避免使用锁(尽管有很多情况需要锁定。)

修改

如果您将数据保存在支持交易的数据源中,例如就像数据库一样,那么你首先要检查用户在页面上点击“是”和接收响应的应用程序之间的时间内尚未购买用户试图购买的内容。因此,您需要检查数据源以查看它是否尚未购买,如果没有,则为用户“购买”该项目。这应该在交易内完成,因此它是原子的,因此如果“购买”项目的行动成功,您只需从用户的账户中取钱。

答案 1 :(得分:3)

您可以使用[MethodImpl]属性装饰它:

[MethodImpl(MethodImplOptions.Synchronized)]
public static void SomeMethod()
{
    ...
}

这样只有一个线程可以执行该方法而其他线程将等待。它相当于将lock放到整个方法体上。