有关锁的问题???
窗口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





