具有多个db调用的方法的线程安全性

时间:2013-05-01 08:51:15

标签: c# thread-safety locking

我刚读过这个问题Which design is most preferable: test-create, try-create, create-catch?

关于答案,似乎开发人员更喜欢“尝试创建”模式,其中一些人提到 TryCreate(用户,输出结果代码)可以是线程安全,但其他模式不是。

TRY-创建

enum CreateUserResultCode
{
    Success,
    UserAlreadyExists,
    UsernameAlreadyExists
}

if (!TryCreate(user, out resultCode))
{
    switch(resultCode)
    {
        case UserAlreadyExists: act on user exists error;
        case UsernameAlreadyExists: act on username exists error;
    }
}

我在想,如果 tryCreate 方法涉及多个数据库调用,那么在实际操作中使其成为线程安全的正确方法是什么?

tryCreate 会做两件事:

  1. 检查db

  2. 中是否存在用户名
  3. 如果名称不存在,则创建一个新名称

  4. 线程很可能完成1而不是2,另一个线程开始调用此方法 tryCreate ,并且还完成1,这是一个竞争条件。

    当然,在 tryCreate 中我可以添加一个锁或者某个,但它会使 tryCreate 成为热点。如果我有一个备受瞩目的网站,所有新注册都必须等待 tryCreate 中的锁定。

    我从其他网站看到的是,当您输入用户名时,它会触发ajax调用以检查它是否存在于当前数据库中,然后您转到下一步创建它。(不确定是否存在锁定此时已创建。)

    关于如何在现实生活中实现涉及多个数据库调用的正确安全 tryCreate 的任何想法?

    更新1 TryCreate 的逻辑可能非常复杂,而不仅仅是2 db调用

1 个答案:

答案 0 :(得分:0)

线程安全概念不会产生到数据库。所以无论你在客户端做什么都没有对数据库方面产生影响,纯粹是因为设计数据库支持来自许多客户端的多个并发连接。

而是使用事务在数据库端执行多个操作作为原子操作。