我刚读过这个问题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 会做两件事:
检查db
如果名称不存在,则创建一个新名称
线程很可能完成1而不是2,另一个线程开始调用此方法 tryCreate ,并且还完成1,这是一个竞争条件。
当然,在 tryCreate 中我可以添加一个锁或者某个,但它会使 tryCreate 成为热点。如果我有一个备受瞩目的网站,所有新注册都必须等待 tryCreate 中的锁定。
我从其他网站看到的是,当您输入用户名时,它会触发ajax调用以检查它是否存在于当前数据库中,然后您转到下一步创建它。(不确定是否存在锁定此时已创建。)
关于如何在现实生活中实现涉及多个数据库调用的正确安全 tryCreate 的任何想法?
更新1 : TryCreate 的逻辑可能非常复杂,而不仅仅是2 db调用
答案 0 :(得分:0)
线程安全概念不会产生到数据库。所以无论你在客户端做什么都没有对数据库方面产生影响,纯粹是因为设计数据库支持来自许多客户端的多个并发连接。
而是使用事务在数据库端执行多个操作作为原子操作。