我有一个之前总是可以更新的表,但突然之间,我再也无法更新表中的任何列。我仍然可以查询整个表格,结果回来的速度非常快,但是当我尝试更新表格中的列时,更新查询只会暂停并且什么都不做。
我尝试使用
select req_transactionUOW
from master..syslockinfo
where req_spid = -2
查看某个孤立事务是否锁定了表,但它没有返回任何结果。
我似乎无法找到我的桌子被锁定的迹象,但根本无法更新它。关于如何修复表格或其所处状态的任何线索?
答案 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_NAME
和OBJECT_NAME
函数获取与dbid
和ObjId
列对应的名称。
答案 4 :(得分:0)
桌面上有任何触发器吗? 如果是这样,可能是触发器失败,从而阻止了更新。
答案 5 :(得分:0)
你能更新其他表吗?如果不是(或者无论如何,如果您愿意),您可以检查事务日志是否已满(如果使用完整恢复模型)/事务日志所在的分区是否已满。我认为如果SQL Server无法写入事务日志,您将会/可能会遇到此行为。
DBCC将是您的朋友:DBCC SQLPERF(LOGSPACE)
向您显示您的日志使用量(以百分比表示)。如果它(接近)100%,这可能是你的问题。
我的两个便士值得。