有关锁的问题???

yl259443 2006-09-05 02:44:43
窗口1:
begin tran
select * from tab with(rowlock,xlock) where groupname=8
窗口2:
select * from tab

结果窗口2出来的是tab的全部数据,在窗口1中不是给groupname=8的
行加了排它锁,为什么还会出来全部数据呢????
在tab中没加任何索引
...全文
688 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangdehao 2006-09-19
  • 打赏
  • 举报
回复
我也想知道为什么要这样设计,改天有时间发表个帖子,问明白这个问题...
lzuyh 2006-09-19
  • 打赏
  • 举报
回复
锁里有这么多学问,学习。。。。。。
我的补丁还没有打上,sql2000的补丁有这么大的差别》?
yl259443 2006-09-14
  • 打赏
  • 举报
回复
谢谢楼上的,改了之后确实可以,但是我要的并不是结果而是为什么会这样??
jias 2006-09-13
  • 打赏
  • 举报
回复
select * from tab with(rowlock,xlock) where groupname=8
改成
select * from tab with(paglock,xlock) where groupname=8
试试吧
wangdehao 2006-09-08
  • 打赏
  • 举报
回复
......sp4下确实如楼主所述,为什么要这样呢?
wangdehao 2006-09-08
  • 打赏
  • 举报
回复
我看看我把补丁打到sp4结果是什么样子的
yl259443 2006-09-08
  • 打赏
  • 举报
回复
我是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)
这是怎么回事呢??不会是个人版的问题吧?
wangdehao 2006-09-07
  • 打赏
  • 举报
回复
不允许
fxf66 2006-09-07
  • 打赏
  • 举报
回复
select * from tab
默认是允许脏读的?
wangdehao 2006-09-07
  • 打赏
  • 举报
回复
这样看:
窗口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)


应该可以明白锁到底是干什么的了

楼主对锁的理解有问题



wangdehao 2006-09-07
  • 打赏
  • 举报
回复
--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以上,我这没别的测试环境了
wangdehao 2006-09-07
  • 打赏
  • 举报
回复



--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





hchzhppp 2006-09-07
  • 打赏
  • 举报
回复
关注
yl259443 2006-09-07
  • 打赏
  • 举报
回复
好的,谢谢!!
wangdehao 2006-09-07
  • 打赏
  • 举报
回复
晚上我把测试的结果发上来,我现在忙
yl259443 2006-09-07
  • 打赏
  • 举报
回复
--如果先执行1的话,必须等到1事务执行完毕 2才会执行 因为1上有排他锁

我试验的结果不是这样的呀,1事务没执行完事务2马上就可以出结果。


--这个如果先执行1的话,在1事务没完毕的时候2就会有结果,但2的结果不包括groupname=8这条记录

结果和select * from tab是一样的
时间再长也是一样的

大哥有时间帮我试一下可以吗?谢谢!!



wangdehao 2006-09-07
  • 打赏
  • 举报
回复
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进行操作的



可以把时间调的再长点就明白了




yl259443 2006-09-07
  • 打赏
  • 举报
回复
to wangdehao(找找找(现在很幸福))
我按你提供的试了一下,select * from tab 和 select * from tab with(readpast)
得出结果是一样得。readpast得意思是跳过已锁定的行,难道是tab没上锁?可是我用
exec sp_lock 查看时发现tab表已经上了行锁了。这到底时怎么回事?
能给我解释一下吗?谢谢!!!
yl259443 2006-09-06
  • 打赏
  • 举报
回复
是sql2000,按理说加了排他锁就不能被其他事务读到的呀
xiaoku 2006-09-06
  • 打赏
  • 举报
回复
是sql2005吗?
不懂为什么?也许是系统的一种机制吧:防死机机制,免得多几个这种查询服务器就挂了!
加载更多回复(5)

22,210

社区成员

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

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