更新和选择后sql server中的锁定错误

Posted

技术标签:

【中文标题】更新和选择后sql server中的锁定错误【英文标题】:Lock error in sql server after updating and selecting 【发布时间】:2013-10-07 10:57:19 【问题描述】:

在我的代码中,我需要将托盘编号分配给选定的纸箱。

一旦用户选择框(15-30 个框)并按 OK,我运行以下代码。

//UPDATE THE PALLET NO FOR ALL THE SELECTED CARTONS

          foreach (DataGridViewRow item in dgvCartonDetails.Rows)
            
                dbLayer.tblCartonUpdatePalletid(item.Cells["CM_ID"].Value.ToString(), Pno, _Settings.Line.ToString());

    //STORED PROCEDURE:tblCartonUpdatePalletid
    //update tblCarton set CM_palletid = @palletid, cm_cartoncompletetime = getdate() where cm_id = @cm_id
            
            //PRINT ALL THE BOXES IN THE PALLET
            dbLayer.tblPrintAllCartonsOfthePallet(PalletID);

    //STORED PROCEDURE: tblPrintAllCartonsOfthePallet
    //select * from tblCarton where cm_palletid = @PalletID

有时我会遇到锁定错误(参考图片)。

我也给出了存储过程数据以供参考。纸箱表将以每天 5000 条记录的速度增长。

我不知道我错过了什么。我应该在哪里调查?提前致谢。

【问题讨论】:

【参考方案1】:

必须有另一个进程同时运行。您需要确定它是什么。如果可能的话,最好的办法是在分析器中捕获死锁,因为它会准确地显示哪些进程死锁以及一个哪些资源。

我假设您在 1 个事务中运行这 2 个查询。

如果有 2 个进程在运行上面的代码,那么它们可能会同时更新 tblCarton。第一个更新第 1 页的记录,第二个更新第 2 页的记录。然后他们需要反向更新页面:首先需要更新第 2 页和第二页 1。这将导致死锁。

如果没有从分析器获得死锁报告,很难说这是否确实发生了。

【讨论】:

以上是关于更新和选择后sql server中的锁定错误的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 锁定的 UPDATE 优化

Python中的SQL更新命令找不到列并且数据库被锁定

清除并填充SQL Server中的表

单击更新后,sql server db中的行将被删除。 id 是唯一有数据的字段

SQL Server 中的错误更新

SQL Server 中的选择性更新