feiachen 发表于 2008-10-23 11:36

关于隔离级别3下,查询的锁问题

sybase 12.5版本

表T_sample为datarows锁。
执行语句
select * from T_sample holdlock where id="100"

表T_sample中只有1条id="100"的记录。

sp_lock查看锁持有情况:
fid    spidloid      locktype                  table_id    page      
      row    dbname          class                        
      context                     
------ ------ ----------- ---------------------------- ----------- -----------
      ------ --------------- ------------------------------
      ----------------------------
      0    26          52 Sh_intent                      144000513          0
            0 testdb          Non Cursor Lock            
                                    
      0    26          52 Sh_row                        144000513      641
            0 testdb          Non Cursor Lock            
      Range                        
      0    26          52 Sh_row                        144000513      641
            1 testdb          Non Cursor Lock            
      Range            


为什么会对641页的0和1两行记录持有共享锁呢?

我定性的认为应该只持有0行,也就是id=“100”这条记录的锁啊!
1行是id="200"的记录。

请赐教!

feiachen 发表于 2008-10-23 11:39

回复 #1 feiachen 的帖子

同样,在隔离级别3下,如果update一个不存在的记录,也会产生一个共享锁,这是为什么

chuxu 发表于 2008-10-23 14:40

用dbcc page 看一下641页的内容

feiachen 发表于 2008-10-23 14:44

回复 #3 chuxu 的帖子

641页0行是id=‘100’的行,1行是id=‘200’的行,就是这样

chenfeng825 发表于 2008-10-23 19:00

怀疑同一个transaction里选择了两次。
至于更新产生共享锁和isolation level 3的目的有关,看看performance tunning 的isolation level effect locking部分
页: [1]
查看完整版本: 关于隔离级别3下,查询的锁问题