【问题标题】:Lock request time out period exceeded when running long update script运行长更新脚本时超过锁定请求超时期限
【发布时间】:2018-03-19 00:13:30
【问题描述】:

我试图找到类似的东西,但没能决定直接问。

我正在运行较长的批量更新脚本,它正在更新大约 50m 条记录。更新是分批中断的,带有允许清除事务日志的检查点。现在尝试运行脚本两次,第一次在更新大约 17m 行后中断,第二次在 14m 处停止。

错误消息:消息 1222,级别 16,状态 43,行 122 超过锁请求超时时间

这是伪代码:

BEGIN TRANSACTION

CREATE TABLE #Update (
    I_ID int PRIMARY KEY NOT NULL IDENTITY(1,1),
    PrimaryKeyID bigint NOT NULL,
    UpdateValue int
)

DECLARE @RecordsToUpdate int
DECLARE @ChunkCount int = 25000
DECLARE @CommitCount int = 100000
DECLARE @CheckpointCount int = 500000

-- Populate the whole table and values. 
...
-- Update the data. 
WHILE @RecordsUpdated < @RecordsToUpdate 
BEGIN
    SET @CurrentRecordsToUpdate = @RecordsUpdated + @ChunkCount

    UPDATE RealTable
    SET Val = UpdateVal
    FROM #Update
        INNER JOIN RealTable ON RealTable.PrimaryKeyID = #Update.PrimaryKeyID
    WHERE #Update.I_ID BETWEEN @RecordsUpdated AND @CurrentRecordsToUpdate

    SET @RecordsUpdated = @CurrentRecordsToUpdate

    IF @RecordsUpdated % @CheckpointCount = 0
    BEGIN
        CHECKPOINT
    END

    IF @RecordsUpdated % @CommitCount = 0
    BEGIN
        COMMIT TRANSACTION
        BEGIN TRANSACTION
    END

END

COMMIT TRAN

我在另一个行数较少(~20m)的数据库上运行它,它运行得很好。任何想法或想法将不胜感激。它极不可能与另一笔交易发生冲突,因为系统因更新而关闭。 p.s.如果重要的话,它在 SQL Server 2014 上。

【问题讨论】:

  • “它坏了” - 实际的错误消息会很有用,因为听起来有些资源正在耗尽。
  • @Turophile 抱歉,错误消息在主题中:Msg 1222, Level 16, State 43, Line 122 Lock request time out period exceeded。添加到身体。谢谢!
  • 我怀疑在您更新表格时有其他东西正在访问您的表格。试试这里的建议:stackoverflow.com/questions/8258710/…

标签: sql sql-server database


【解决方案1】:

目前还不确定这是否是问题,但在查看 SSMS 设置查询执行 > 高级后,我发现 SET Lock Timeout 参数设置为值 10000。很有可能将其更新为 -1 可能会解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    相关资源
    最近更新 更多