• 有关sqlserver的锁


    今天有被问到:sqlserver锁定一行的最小锁是什么?
    当时答曰:行级锁

    回来查文档,得有关锁的信息(sql2k用syslockinfo表查, sql2k5用sys.dm_tran_locks表查)

    资源类型:
    1 = NULL 资源(未使用)
    2 = 数据库
    3 = 文件
    4 = 索引
    5 = 表
    6 = 页
    7 = 键
    8 = 区
    9 = RID(行 ID)
    10 = 应用程序

    OK,现在来看看锁定到一行的最小级别的锁是什么。

     1D:\Program Files\Microsoft SQL Server\90\Tools\Binn>osql -Usa -Pdba123 -Sdragon
     21> create table t_pk(t_id int primary key, t_desc varchar(50));
     32> create table t_heap(t_id int, t_desc varchar(50));
     43> go
     51> insert into t_pk values(1'welcome');
     62> insert into t_pk values(2'nice to meet you');
     73> insert into t_pk values(3'wall street, stock');
     84> go
     9(1 行受影响)
    10(1 行受影响)
    11(1 行受影响)
    121> insert into t_heap select * from t_pk;
    132> go
    14(3 行受影响)
    151> begin tran
    162> update t_pk set t_desc = 'have a nice day' where t_id = 3;
    173> go
    18(1 行受影响)
    19

    现在,我更新有主键的表t_pk,看看sqlserver锁了些什么东东:



    这里,sqlserver对t_pk表以及相应的page加上了IX锁,对更新的那一行加上了X锁。

    再来,现在试试对堆表的更新:

    1> rollback;
    2> go
    1> begin tran
    2> update t_heap set t_desc = 'have a nice day' where t_id = 3;
    3> go

    看看sqlserver对堆表锁了些什么:


    sqlserver 2005很聪明,也只锁了一行(曾记得,sql2k对堆表会锁住一个page的,待找sql2k再测试)。

    这2个测试中的锁定,一个是KEY, 一个是RID, 基本符合我所说的行级锁的意思。但真较上劲的话,我的答案又似乎不足,:)

  • 相关阅读:
    ‘随意’不是个好词,‘用心’才是
    servlet
    tomcat服务器
    http协议
    jdbc(Java数据库连接)
    dbcp和druid(数据库连接池)
    关于GitHub
    冒泡和递归
    python内置函数
    python四
  • 原文地址:https://www.cnblogs.com/JLL/p/1240207.html
Copyright © 2020-2023  润新知