在事务同时更新期间如何处理唯一索引?

时间:2014-03-20 19:31:35

标签: sql-server sql-server-2005

我试图了解如果多个线程运行,某些事务代码将如何工作。每个记录需要插入一个唯一的5个字符ID,并且每个" job"都必须是唯一的。由唯一索引检查。

我们目前拥有单线程代码并捕获重复错误,创建新的随机ID并再次尝试。但是,我们正在考虑将ID创建转移到后续的多线程处理步骤。事务中还有使用随机ID的代码,但我们希望确保它具有进入记录的ID,并且如果事务结束时的代码失败,则记录更新不会发生。

我想要了解的是,如果事务只能在运行更新查询时失败,并且附加代码引发了另一个错误,或者在运行其他代码后它可能在提交时失败,那么该事务是否会失败。

这是代码大纲....

until transaction completes successfully
    try
        begin transaction
            create randomid
            update an existing record with randomid
            do something that should only be done once
        commit transaction
    catch duplicate id error

我尝试过一些没有显示问题的测试,但不确定我的测试是否足够,以便更好地了解在这种情况下会发生什么。

此外,我认为更新查询不能并行发生,但是从我的测试看来,附加代码似乎也是如此。情况总是如此,还是取决于其他考虑因素?

1 个答案:

答案 0 :(得分:1)

如果列上有唯一索引并更新此列,则SQL Server将锁定索引(键范围)。这将阻止所有其他进程更新同一记录。他们将不得不等待锁被释放,并将被阻止,直到那个时候。锁定释放后,唯一索引将阻止它们更新表格。

由于其他进程必须等待,具体取决于您的超时设置和执行时间,它们可能会超时。除处理重复异常外,您可能希望处理此问题。

如果您的进程尝试使用唯一索引向列中插入不同的值,则可能会并行发生,具体取决于表中的其他锁。