use*_*449 2 sql sql-server concurrency sql-server-2008-r2
我有一个DB表,其字段必须是唯一的.假设该表称为"Table1",唯一字段称为"Field1".
我计划通过执行SELECT来查看是否存在任何Table1记录,其中Field1 = @ valueForField1,并且只有在没有这样的记录存在时才更新或插入.
问题是,我怎么知道这里没有竞争条件?如果两个用户都在写入Table1的表单上单击"保存"(几乎完全相同的时间),并且它们具有相同的Field1值,则不可能发生以下情况吗?
User1进行SQL调用,执行select操作并确定Field1 = @ valueForField1中没有现有记录.User1的进程被User2的进程抢占,该进程也找不到Field1 = @ valueForField1的记录,并执行插入.允许User1的进程再次运行,并在Field1 = @ valueForField1中插入第二条记录,违反了Field1唯一的要求.
我怎么能阻止这个?我被告知交易是原子的,但为什么我们也需要表锁?我之前从未使用过锁,我不知道在这种情况下是否需要锁.如果进程尝试写入锁定表会发生什么?它会阻止并重试吗?
我正在使用MS SQL 2008R2.
在该字段上添加唯一约束.那样你就不用SELECT了.你只需要插入.第一个用户将成功,第二个将失败.
最重要的是,你可以自动增加字段,所以你不必在乎填充它,或者你可以添加一个默认值,再次不关心填充它.
一些选项可以是自动增量的INT字段,也可以是唯一标识符.