Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 运行长更新脚本时超过了锁定请求超时时间_Sql_Sql Server_Database - Fatal编程技术网

Sql 运行长更新脚本时超过了锁定请求超时时间

Sql 运行长更新脚本时超过了锁定请求超时时间,sql,sql-server,database,Sql,Sql Server,Database,我试图找到类似的东西,但没能决定直接问 我正在运行长批量更新脚本,该脚本正在更新约50万条记录。更新后的日志会被分批中断,并带有检查点以允许清除事务日志。现在尝试运行该脚本两次,第一次是在更新了大约1700万行后中断的,第二次是在1400万行时停止的 错误消息:Msg 1222,16级,状态43,第122行 已超过锁定请求超时时间 以下是伪代码: BEGIN TRANSACTION CREATE TABLE #Update ( I_ID int PRIMARY KEY NOT NULL

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

我正在运行长批量更新脚本,该脚本正在更新约50万条记录。更新后的日志会被分批中断,并带有检查点以允许清除事务日志。现在尝试运行该脚本两次,第一次是在更新了大约1700万行后中断的,第二次是在1400万行时停止的

错误消息:Msg 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
开始交易
创建表#更新(
I_ID int主键非空标识(1,1),
PrimaryKeyID bigint不为NULL,
更新值int
)
声明@recordstoupdateint
声明@ChunkCount int=25000
声明@CommitCount int=100000
声明@CheckpointCount int=500000
--填充整个表和值。
...
--更新数据。
而@RecordsUpdated<@RecordsToUpdate
开始
设置@CurrentRecordsToUpdate=@RecordsUpdated+@ChunkCount
更新不动产
SET Val=UpdateVal
从#更新
RealTable.PrimaryKeyID=#Update.PrimaryKeyID上的内部联接RealTable
其中@RecordsUpdated和@CurrentRecordsToUpdate之间的#Update.I_ID
设置@RecordsUpdated=@CurrentRecordsToUpdate
如果@RecordsUpdated%@CheckpointCount=0
开始
检查站
终止
如果@RecordsUpdated%@CommitCount=0
开始
提交事务
开始交易
终止
终止
提交传输
我在另一个数据库上运行了它,该数据库的行数较小(~20m),运行得很好。如有任何想法或想法,将不胜感激。它不太可能与另一个事务发生冲突,因为系统因更新而停机。
p、 如果重要的话,它在SQL Server 2014上

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

“它坏了”-实际的错误消息会很有用,因为听起来好像有些资源正在耗尽。@Turophile抱歉,错误消息在主题中:Msg 1222,级别16,状态43,第122行锁请求超时时间已超过。加在身上。非常感谢。我怀疑在您更新表时有其他内容正在访问您的表。请尝试以下建议: