【问题标题】:How SQL Server handles UPDATE transactions?SQL Server 如何处理 UPDATE 事务?
【发布时间】:2012-11-23 02:57:33
【问题描述】:

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

TableName     VARCHAR
CurrentKey    INT

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

TableName   Customers
CurrentKey  400

因此,当我们需要表 Customers 的下一个主键时,我们会从该表中获得 CurrentKey,其中 TableNameCustomers,它将给我们 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


【解决方案1】:

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

你的第一句话应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多