关于SQL2008锁的疑问,求大神指导

洗头用大宝 2016-04-12 03:12:25
请教一下大神:

假如一个事务正在执行,begin tran
update wh_gather_car set carno='1' where id=1;(正在执行这一句的时候打断点)

我另一个进程此时查询select * from wh_gather_car where id=2就会提示锁表,求大神指导

按说我update ID=1的数据,为什么不允许我查询ID=2的呢?

PS:把ID建上唯一索引到是可以,但是我查询不会每次都按唯一索引查询
...全文
110 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2016-04-13
  • 打赏
  • 举报
回复
进程的锁定信息可以通过系统DMV视图sys.dm_tran_locks查看, 参考 https://msdn.microsoft.com/zh-cn/library/ms190345(v=sql.105).aspx
唐诗三百首 2016-04-13
  • 打赏
  • 举报
回复
我另一个进程此时查询select * from wh_gather_car where id=2就会提示锁表 按说我update ID=1的数据,为什么不允许我查询ID=2的呢? --> 在没有索引时,因为id=1和id=2记录的数据存在同个数据页上,更新id=1时,在该数据页加了X锁,所以无法查询. 我试了一下,建唯一索引,可以按照唯一索引查, --> 当有索引时,更新的where条件为id=1时只对该数据页的key=1加X锁,不影响其他key的查询. 但是不按唯一索引还是查不出来,不可能每个查询都用唯一索引查 --> 当有索引时,更新的where条件不按id=1时,需全表扫描,因此锁住了整个数据页,所以无法查询.
a7747369 2016-04-13
  • 打赏
  • 举报
回复
在更新的时候,这个UPDATE事务获取了一个排它锁,并应用更新。更新锁会一直保持到事务结束,而你另外一个进程想要查询,查询的时候需要获取一个共享锁以读取数据,但他无法获取共享锁,因为第一个事务在其中一行保持着排它锁,所以查询语句被阻塞,SQL SERVER 默认是不会设置锁超时的,所以如果第一个事务不释放排它锁的话,其他进程的查询语句会一直等待,应该是这样吧..........,关于加了索引就可以没事的话,参考一下这个链接。http://www.cnblogs.com/huangxincheng/p/4291446.html
fishparadise 2016-04-12
  • 打赏
  • 举报
回复
查下锁住了什么级别的对象。行?页?表?
洗头用大宝 2016-04-12
  • 打赏
  • 举报
回复
我试了一下,建唯一索引,可以按照唯一索引查,但是不按唯一索引还是查不出来,不可能每个查询都用唯一索引查
--小F-- 2016-04-12
  • 打赏
  • 举报
回复
估计是锁升级 把整个表给锁住了

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧