可以查询Sql server表但不更新

时间:2010-03-02 22:06:31

标签: sql-server sql-server-2005

我有一个之前总是可以更新的表,但突然之间,我再也无法更新表中的任何列。我仍然可以查询整个表格,结果回来的速度非常快,但是当我尝试更新表格中的列时,更新查询只会暂停并且什么都不做。

我尝试使用

select req_transactionUOW
from master..syslockinfo
where req_spid = -2

查看某个孤立事务是否锁定了表,但它没有返回任何结果。

我似乎无法找到我的桌子被锁定的迹象,但根本无法更新它。关于如何修复表格或其所处状态的任何线索?

6 个答案:

答案 0 :(得分:1)

当你说“超时”时,是否达到客户端超时?例如,默认的.net命令超时为30秒。我建议将其增加到一个非常大的值或在SQL工具中运行更新(默认情况下没有超时设置)。

除此之外,更新在某些时候完成,或者错误和回滚:你有足够的时间吗?

还有阻塞,最后一次索引重建,上次统计信息更新,触发器,意外交叉连接,MDF或LDF文件增长,糟糕的IO,操作系统分页......等等。您是否重新启动了SQL实例或服务器以删除环境问题并杀死所有其他连接?

根本没有足够的信息来判断对不起。

答案 1 :(得分:0)

我猜这不是权限问题,因为您没有收到错误。

所以我之前最接近的就是表上的索引已经腐败了。您是否尝试删除索引并重新创建它们?首先尝试一个一个。

答案 2 :(得分:0)

请您发出此查询:

SELECT  COUNT(*)
FROM    mytable WITH (UPDLOCK, READPAST)

将跳过锁定的记录并确保它返回与

相同数量的记录
SELECT  COUNT(*)
FROM    mytable

您可能需要对强制表上的每个索引重复它,以确保没有锁定索引资源。

答案 3 :(得分:0)

如果您怀疑是锁定,我要做的第一件事就是运行sp_lock。它将为您提供所有当前锁定的列表。您可以使用DB_NAMEOBJECT_NAME函数获取与dbidObjId列对应的名称。

答案 4 :(得分:0)

桌面上有任何触发器吗? 如果是这样,可能是触发器失败,从而阻止了更新。

答案 5 :(得分:0)

你能更新其他表吗?如果不是(或者无论如何,如果您愿意),您可以检查事务日志是否已满(如果使用完整恢复模型)/事务日志所在的分区是否已满。我认为如果SQL Server无法写入事务日志,您将会/可能会遇到此行为。

DBCC将是您的朋友:DBCC SQLPERF(LOGSPACE)向您显示您的日志使用量(以百分比表示)。如果它(接近)100%,这可能是你的问题。

我的两个便士值得。