关键部分Web API

时间:2015-05-13 02:50:27

标签: c# synchronization locking

我正在创建一个创建新用户的端点。两个请求同时发送到端点,将创建两个用户。我如何保护这个关键部分?我尝试使用" [MethodImpl(MethodImplOptions.Synchronized)]"但是它不会阻止两个线程进入临界区。

   User user = db.User.Where(u => u.FbId.Equals(userObject.fbid)).FirstOrDefault();

        if (user == null)     // critical section
        {
          // create user and save it to database
          db.SaveChanges();
       }

1 个答案:

答案 0 :(得分:0)

除非您在代码中分配ID(不好主意)而不是由数据库服务器自动分配ID,但如果您确实想拥有一个关键部分,那么看起来您的代码将并行运行并且您不会得到如果您使用自动分配的ID或GUID作为ID,则任何重复的ID:

来自Web浏览器的每个请求都由一个单独的线程处理。这可以是在一个进程下运行的线程,或者如果您在IIS中进行设置,则可以将应用程序更改为在多个进程下运行。

如果最终将应用程序部署到Azure云,则即使在同一台计算机上,线程也可能无法运行。这对使用Lock和Global Mutex都有影响。 Lock是一个只有进程的互斥锁,因此只能处理自进程多线程的情况。 全局互斥锁在多个进程中运行多个线程。但是,如果在网络上的多个地理位置分散的计算机上运行,​​则需要使用与全局Mutex一起运行的特殊单机,或者使用其他人预先注册的全局互斥体 - 例如使用数据库服务器的锁定和解锁功能,例如。使用GUID的GUID意味着不需要互斥锁,因此理论上对于大容量系统来说更快。