现在我遇到一个存储过程在运行时锁定的问题。
它是从 Sybase 转换过来的。
本来存储过程就可以了
TRUNCATE TABLE appInfo
然后在同一存储过程中重新填充数据,但在 SQL Server 中,这似乎会导致用户锁定。
它不是一个高流量的数据库。
我尝试的改变是要做的
BEGIN TRAN
DELETE TABLE appInfo
COMMIT TRAN
然后重新填充数据,但用户在这个数据上遇到了 NO_DATA_FOUND
错误。
所以如果我TRUNCATE
他们得到数据,但它会导致锁定
如果我执行删除,则找不到数据。
有人对这种情况和解决方案有任何了解吗?我正在考虑将截断操作移出到一个单独的存储过程中,并从父过程中调用,但这可能只是将问题推到一边,并没有真正解决它。
提前致谢
最佳答案
当您截断表时,整个表都被锁定(来自 MSDN https://technet.microsoft.com/en-us/library/ms177570%28v=sql.105%29.aspx - TRUNCATE TABLE 始终锁定表和页,但不是每一行。)当您发出删除表,它锁定一行,将其删除,然后锁定下一行并将其删除。您的用户将继续参与其中。我会选择截断,因为它几乎总是更快。
关于sql-server - 截断与删除和表锁 SQL Server 2012,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29171634/