sql-server - 截断与删除和表锁 SQL Server 2012

标签 sql-server stored-procedures truncate

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

它是从 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/

相关文章:

php - 在 Laravel 中为现有数据库中的存储过程、函数和事件创建迁移

sql - 如何在SQL Server存储过程中通过try catch语句得到错误 "Error converting data type nvarchar to int."?

php - PHP 中没有截断函数 - 选项?

javascript - 使用 JavaScript 将文本 chop 到特定大小 (8 KB)

excel - 从 Excel 导入到 Access 备注字段时数据被截断

c# - UWP SQL 连接错误 [c#]

sql-server - 免费云存储来托管 MS Sql

sql向每一行添加额外的行

c# - mongodb 的 SQL CLR 抛出 'MongoDB.Bson.Serialization.BsonSerializer' 异常

sql - 如何创建存储过程以将数据从查询复制到临时表?