【问题标题】:Truncate Vs Delete and Table Locks SQL Server 2012截断与删除和表锁 SQL Server 2012
【发布时间】:2015-03-20 16:40:49
【问题描述】:

现在我遇到了一个存储过程在运行时被锁定的问题。

这是从 Sybase 转换而来的。

原来的存储过程会这样做

TRUNCATE TABLE appInfo

然后在同一个存储过程中重新填充数据,但在 SQL Server 中,这似乎会导致用户锁定。

它不是一个高流量的数据库。

我尝试的改变是要做的

BEGIN TRAN
DELETE TABLE appInfo
COMMIT TRAN

然后重新填充数据,但用户在这一项上收到 NO_DATA_FOUND 错误。

所以如果我TRUNCATE 他们获取数据,但它会导致锁定

如果我进行删除,则找不到数据。

有人对这种情况有任何见解和解决方案吗?我正在考虑将截断提取到一个单独的存储过程中并从父过程中调用,但这可能只是将问题推到后面,并没有真正解决它。

提前致谢

【问题讨论】:

  • 您是否因为要重置身份而使用 Truncate? “DELETE [TABLE]”也是“DELETE * FROM [TABLE]”吗?

标签: sql-server stored-procedures truncate


【解决方案1】:

当你截断一个表时,整个表被锁定(来自 MSDN https://technet.microsoft.com/en-us/library/ms177570%28v=sql.105%29.aspx - TRUNCATE TABLE 总是锁定表和页面,但不是每一行。)当你发出一个删除表,它锁定一行,删除它,然后锁定下一行并删除它。您的用户正在继续上桌,因为它正在发生。我会选择截断,因为它几乎总是更快。

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多