2

我们有一个用于生成唯一数字键的表。然后这些键在其他表中用作 PrimaryKey。表结构是这样的:

TableName     VARCHAR
CurrentKey    INT

所以我们在这张表中有数据

TableName   Customers
CurrentKey  400

因此,当我们需要表的下一个主键时,Customers我们CurrentKey从该表中获取TableNameis Customers,它将给我们 400,我们将其递增 (400+1) 并且我们也在表中更新此键。所以我们CurrentKey现在是401。

我们为此目的使用的sql是:

SQL1:

DECLARE  @CurrentKey INT
UPDATE  myTable 
SET @CurrentKey = CurrentKey = CurrentKey + 1
WHERE   TableName = @TableName

我的问题是,如果多个用户同时调用它,我们是否需要锁定表以便密钥不会重复?我确信 SQL Server 不会允许重复数据,但我不知道如何...使用表锁定查询:

SQL2

BEGIN TRANSACTION
    DECLARE  @CurrentKey INT
    UPDATE  myTable WITH (TABLOCKX)
    SET @CurrentKey = CurrentKey = CurrentKey + 1
    WHERE   TableName = @TableName
END TRANSACTION

有人可以解释一下 SQL Server 如何处理UPDATE调用吗?

4

1 回答 1

1

每个 SQL 语句都在一个事务中运行,并且一个update语句总是使用一个锁来保护它的更新。SQL Server 不允许您读取半修改的行(对于大于 8k 的数据有一些例外。)

你的第一个陈述应该没问题。

于 2012-12-05T10:13:43.450 回答