截断Vs删除和表锁定SQL Server 2012

时间:2015-03-20 16:40:49

标签: sql-server stored-procedures truncate

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

这是Sybase的转换。

存储过程最初会执行

TRUNCATE TABLE appInfo

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

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

我尝试的改变是要做的

BEGIN TRAN
DELETE TABLE appInfo
COMMIT TRAN

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

因此,如果我TRUNCATE他们获取数据,但会导致锁定

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

任何人都对这种情况和解决方案有任何了解吗?我正在考虑将truncate转移到一个单独的存储过程并从父过程中调用,但这可能只会推动问题,而不是实际解决它。

提前致谢

1 个答案:

答案 0 :(得分:2)

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

相关问题