日期:2014-05-18  浏览次数:20702 次

为什么锁不自动释放
SET   TRANSACTION   ISOLATION   LEVEL   READ   COMMITTED
go
begin   tran
select   purprice   from   u_batsale_c   where   wareid   =   '001897 '
go
exec   sp_lock
go
rollback

上述语句执行的结果如下(objid=875866187对应的表名即u_batsale_c)   :

5.90000

51 9 0 0 DB S GRANT
51 9 875866187 0 TAB S GRANT
51 1 85575343 0 TAB IS GRANT


不明白为什么这个查询语句结束但是这个共享锁仍然没有释放呢(sp_lock结果的第二行)?
我试了,别的表都不会这样,仅这个表是这样.
将这个表的索引删除或重建后也不会有这种情况;
同样的数据结构但记录不一样,别的数据库也不会有这种情况,试过很多数据库.

这样岂不是导致我每查询完一条都必须要提交一次事务吗?因为我用的PB自动创建事务模式,每条语句前会自动加   begin   tran   。

请大家帮忙看看

------解决方案--------------------
这种情况只能靠猜了

估计与索引维护有一定关系,特别是聚集索引的维护,建议变化大的数据表制定适当的维护计划,定期维护(重建)聚集索引
------解决方案--------------------
51 9 875866187 0 TAB S GRANT
你这个锁是个表锁
http://topic.csdn.net/t/20040218/14/2747861.html
描述的是表锁的可能性很大



------解决方案--------------------
你的可能有个锁级别的升级,但http://topic.csdn.net/t/20040218/14/2747861.html本来就应该加表锁

------解决方案--------------------
帮顶,学习
------解决方案--------------------
只要把原表的索引删除后重建都没问题
-------------------------------------

那出问题的时候试试 dbcc indexdefrg 或者 dbcc dbreindex (整理索引碎片或者重构索引)
有可能是索引碎片太高,然后出的一些问题