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