锁定并发读取行表

时间:2019-04-30 16:45:45

标签: c# sql sql-server entity-framework transactions

我在SQL Server中有一个名为“连续”的表,该表中存储了一个数字。

我还有另一个表“数据”,它们存储记录,列中的一个是数字,该数字取自“连续”表。

要分配连续项,请阅读“连续”表,然后将该值增加1,然后保存。

问题在于,当执行多个线程时,它不会读取“连续”的当前值,而是重复数字。

如何阻塞表的行,以便只有一个线程可以同时读取和更新它,从而避免重复数字?

1 个答案:

答案 0 :(得分:0)

最好不要有此要求-因为这意味着所有尝试插入到data的事务都将被序列化并阻止,直到先前的事务提交或回滚为止。

理想情况下,您应该改用IDENTITYSEQUENCE

但是这些都不保证连续性,如果这是“必须具备”的,那么最好的方法是进行原子更新并同时读取值。

假设您具有以下设置

CREATE TABLE Consecutives
  (
     Scope  VARCHAR(20) PRIMARY KEY,
     Number INT
  );

INSERT INTO Consecutives
VALUES     ('Data',
            76); 

下面是在阻止其他交易的同时增加值并读取结果的代码。

DECLARE @Number INT;

UPDATE Consecutives
SET @Number = Number+=1
WHERE Scope = 'Data';

SELECT @Number

这使用UPDATESET @variable = column = expression语义将更新后列值分配给变量。

如果您要确保没有空格(至少在没有对该列的任何删除或更新的情况下),则此操作应与插入Data的事务相同。