CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

有关锁的问题???

楼主yl259443()2006-09-05 14:44:43 在 MS-SQL Server / 疑难问题 提问

窗口1:  
  begin   tran  
  select   *   from   tab   with(rowlock,xlock)   where   groupname=8  
  窗口2:  
  select   *   from   tab  
   
  结果窗口2出来的是tab的全部数据,在窗口1中不是给groupname=8的  
  行加了排它锁,为什么还会出来全部数据呢????  
  在tab中没加任何索引 问题点数:60、回复次数:25Top

1 楼zicxc(冒牌邹建 V0.4)回复于 2006-09-05 14:52:38 得分 5

锁的作用和事务隔离级别有关  
   
  建议楼主看看这方面的帮助(SET   TRANSACTION   ISOLATION   LEVEL)  
   
  Top

2 楼yl259443()回复于 2006-09-05 14:56:18 得分 0

事务的隔离级别是系统默认的  
  事务的隔离级别只跟锁的持续时间有关吧?  
  Top

3 楼yl259443()回复于 2006-09-05 15:02:38 得分 0

在默认事务隔离级别排他锁的持续时间是事务提交,可是窗口1的事务没有提交应该一直有排他锁的,我就是搞不明白为什么窗口2会读出全部数据??Top

4 楼joy2th()回复于 2006-09-05 15:46:25 得分 0

 
  楼主,去www.mylinux.com.cn看看,那里专业资料多,应该能得到解答Top

5 楼diaowf()回复于 2006-09-06 09:07:08 得分 0

TopTop

6 楼xiaoku(野蛮人(^v^))回复于 2006-09-06 09:36:31 得分 0

是sql2005吗?  
  不懂为什么?也许是系统的一种机制吧:防死机机制,免得多几个这种查询服务器就挂了!Top

7 楼yl259443()回复于 2006-09-06 09:45:49 得分 0

是sql2000,按理说加了排他锁就不能被其他事务读到的呀Top

8 楼wangdehao(找找找(现在很幸福))回复于 2006-09-07 10:58:48 得分 45

这样看:  
  窗口1:  
  begin   tran  
  select   *   from   tab   with(rowlock,xlock)   where   groupname=8  
  waitfor   delay   '0:00:05'  
  commit   tran  
   
  窗口2:  
  select   *   from   tab  
   
   
  比较:  
  窗口1:  
  begin   tran  
  select   *   from   tab   with(rowlock,xlock)   where   groupname=8  
  waitfor   delay   '0:00:05'  
  commit   tran  
   
  窗口2:  
  select   *   from   tab   with(readpast)  
   
   
  应该可以明白锁到底是干什么的了  
   
  楼主对锁的理解有问题  
   
   
   
  Top

9 楼fxf66()回复于 2006-09-07 11:02:22 得分 0

select   *   from   tab  
  默认是允许脏读的?Top

10 楼wangdehao(找找找(现在很幸福))回复于 2006-09-07 11:03:35 得分 0

不允许Top

11 楼yl259443()回复于 2006-09-07 15:45:12 得分 0

to     wangdehao(找找找(现在很幸福))  
  我按你提供的试了一下,select   *   from   tab   和   select   *   from   tab   with(readpast)  
  得出结果是一样得。readpast得意思是跳过已锁定的行,难道是tab没上锁?可是我用  
  exec   sp_lock   查看时发现tab表已经上了行锁了。这到底时怎么回事?  
  能给我解释一下吗?谢谢!!!  
  Top

12 楼wangdehao(找找找(现在很幸福))回复于 2006-09-07 16:12:41 得分 0

begin   tran  
  select   *   from   tab   with(rowlock,xlock)   where   groupname=8  
  waitfor   delay   '0:00:05'  
  commit   tran  
   
  窗口2:  
  select   *   from   tab  
   
   
  如果先执行1的话,必须等到1事务执行完毕   2才会执行     因为1上有排他锁  
   
   
   
   
   
  窗口1:  
  begin   tran  
  select   *   from   tab   with(rowlock,xlock)   where   groupname=8  
  waitfor   delay   '0:00:05'  
  commit   tran  
   
  窗口2:  
  select   *   from   tab   with(readpast)  
   
  这个如果先执行1的话,在1事务没完毕的时候2就会有结果,但2的结果不包括groupname=8这条记录  
   
   
   
   
  你得到那个结果是因为你2次对1操作事务完毕后才对2进行操作的  
   
   
   
  可以把时间调的再长点就明白了  
   
   
   
   
  Top

13 楼yl259443()回复于 2006-09-07 16:28:26 得分 0

--如果先执行1的话,必须等到1事务执行完毕   2才会执行     因为1上有排他锁  
   
  我试验的结果不是这样的呀,1事务没执行完事务2马上就可以出结果。  
   
   
  --这个如果先执行1的话,在1事务没完毕的时候2就会有结果,但2的结果不包括groupname=8这条记录  
   
  结果和select   *   from   tab是一样的  
  时间再长也是一样的  
   
  大哥有时间帮我试一下可以吗?谢谢!!  
   
   
   
  Top

14 楼wangdehao(找找找(现在很幸福))回复于 2006-09-07 16:57:35 得分 0

晚上我把测试的结果发上来,我现在忙Top

15 楼yl259443()回复于 2006-09-07 17:01:33 得分 0

好的,谢谢!!Top

16 楼hchzhppp()回复于 2006-09-07 17:52:33 得分 0

关注Top

17 楼wangdehao(找找找(现在很幸福))回复于 2006-09-07 19:14:14 得分 0

 
   
   
  --sqlserver2000   SP3下  
  ----生成测试环境  
  create   table   tab   (  
  id   int,  
  groupname   int  
  )  
  insert   tab   select   1,8  
  union   all  
  select   2,7  
  union   all  
  select   3,6  
  union   all  
  select   4,9  
  go  
   
   
  ---窗口1  
   
  begin   tran  
  select   *   from   tab   with(rowlock,xlock)   where   groupname=8  
  waitfor   delay   '0:00:05'  
  commit   tran  
   
  ---窗口2  
  select   *   from   tab  
  ---窗口2结果(在1执行完后出来)  
  id               groupname  
  1 8  
  2 7  
  3 6  
  4 9  
   
   
  ---窗口2  
  select   *   from   tab   with(readpast)  
  ---窗口2结果(立刻显示)  
  id               groupname  
  2 7  
  3 6  
  4 9  
   
   
   
   
   
  Top

18 楼wangdehao(找找找(现在很幸福))回复于 2006-09-07 19:18:56 得分 0

--sqlserver2000     RTM   下(没打补丁)  
   
   
  ---窗口1  
   
  begin   tran  
  select   *   from   tab   with(rowlock,xlock)   where   groupname=8  
  waitfor   delay   '0:00:05'  
  commit   tran  
   
   
  ---窗口2  
  select   *   from   tab   with(readpast)  
  ---窗口2结果(立刻显示)  
  id                     groupname        
  -----------   -----------    
  1                       8  
  2                       7  
  3                       6  
  4                       9  
   
  ---窗口2  
  select   *   from   tab  
  ---窗口2结果(立刻显示)  
  id                     groupname        
  -----------   -----------    
  1                       8  
  2                       7  
  3                       6  
  4                       9  
   
   
   
   
   
   
   
   
  结论:楼主的sqlserver2000补丁没打到sp3以上,我这没别的测试环境了Top

19 楼yl259443()回复于 2006-09-08 09:42:47 得分 0

我是xp上装的个人版的sql2000,我记得好像已经过sp4的补丁了。  
  select   @@version   出现如下信息:  
  Microsoft   SQL   Server     2000   -   8.00.2039   (Intel   X86)       May     3   2005   23:18:38        
   
  Copyright   (c)   1988-2003   Microsoft   Corporation     Personal   Edition   on   Windows   NT   5.1    
   
  (Build   2600:   Service   Pack   2)  
  这是怎么回事呢??不会是个人版的问题吧?Top

20 楼wangdehao(找找找(现在很幸福))回复于 2006-09-08 09:51:28 得分 0

我看看我把补丁打到sp4结果是什么样子的Top

21 楼wangdehao(找找找(现在很幸福))回复于 2006-09-08 10:41:50 得分 0

......sp4下确实如楼主所述,为什么要这样呢?Top

22 楼jias(pk)回复于 2006-09-13 15:18:27 得分 10

select   *   from   tab   with(rowlock,xlock)   where   groupname=8  
  改成  
  select   *   from   tab   with(paglock,xlock)   where   groupname=8  
  试试吧Top

23 楼yl259443()回复于 2006-09-14 11:24:45 得分 0

谢谢楼上的,改了之后确实可以,但是我要的并不是结果而是为什么会这样??Top

24 楼lzuyh(天气预报)回复于 2006-09-19 10:07:34 得分 0

锁里有这么多学问,学习。。。。。。  
  我的补丁还没有打上,sql2000的补丁有这么大的差别》?Top

25 楼wangdehao(找找找(现在很幸福))回复于 2006-09-19 11:02:58 得分 0

我也想知道为什么要这样设计,改天有时间发表个帖子,问明白这个问题...Top

相关问题

关键词

得分解答快速导航

  • 帖主:yl259443
  • zicxc
  • wangdehao
  • jias

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo