我有一个数据库表,其中的字段必须是唯一的。假设该表称为“Table1”,唯一字段称为“Field1”。
我计划通过执行 SELECT 来查看 Field1 = @valueForField1 是否存在任何 Table1 记录,并且仅在不存在此类记录时才更新或插入。
问题是,我怎么知道这里没有竞争条件?如果两个用户都在写入 Table1 的表单上(几乎同时)单击保存,并且他们的 Field1 具有相同的值,是否可能会发生以下情况?
User1 进行 SQL 调用,该调用执行选择操作并确定 Field1 = @valueForField1 没有现有记录。User1 的进程被 User2 的进程抢占,该进程也没有找到 Field1 = @valueForField1 的记录,并执行插入。允许 User1 的进程再次运行,并在 Field1 = @valueForField1 的位置插入第二条记录,违反了 Field1 唯一的要求。
我怎样才能防止这种情况?有人告诉我事务是原子的,但是为什么我们也需要表锁呢?我以前从未使用过锁,我不知道在这种情况下我是否需要一个。如果一个进程试图写入一个锁定的表会发生什么?它会阻止并重试吗?
我正在使用 MS SQL 2008R2。