【发布时间】:2012-11-23 02:57:33
【问题描述】:
我们有一个用于生成唯一数字键的表。然后这些键在其他表中用作 PrimaryKey。表结构是这样的:
TableName VARCHAR
CurrentKey INT
所以我们在这张表中有数据
TableName Customers
CurrentKey 400
因此,当我们需要表 Customers 的下一个主键时,我们会从该表中获得 CurrentKey,其中 TableName 是 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 调用?
【问题讨论】:
-
您真的应该让 SQL Server 使用
INT IDENTITY列类型来处理连续数字。 不要尝试自己做这件事!有很多失败的方法...... -
我敢问您为什么要尝试重新发明
IDENTITY列?另外,您为什么要集中保存当前值的表格?浪费时间,可能是错误的,而且不如直接查询表准确。 -
数据库超过12年了,我不允许更改旧逻辑!!
标签: sql sql-server-2008 transactions table-locking