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

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

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

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

 1有关sqlserver的锁D:\Program Files\Microsoft SQL Server\90\Tools\Binn>osql -Usa -Pdba123 -Sdragon
 2有关sqlserver的锁1> create table t_pk(t_id int primary key, t_desc varchar(50));
 3有关sqlserver的锁2> create table t_heap(t_id int, t_desc varchar(50));
 4有关sqlserver的锁3> go
 5有关sqlserver的锁1> insert into t_pk values(1'welcome');
 6有关sqlserver的锁2> insert into t_pk values(2'nice to meet you');
 7有关sqlserver的锁3> insert into t_pk values(3'wall street, stock');
 8有关sqlserver的锁4> go
 9有关sqlserver的锁(1 行受影响)
10有关sqlserver的锁(1 行受影响)
11有关sqlserver的锁(1 行受影响)
12有关sqlserver的锁1> insert into t_heap select * from t_pk;
13有关sqlserver的锁2> go
14有关sqlserver的锁(3 行受影响)
15有关sqlserver的锁1> begin tran
16有关sqlserver的锁2> update t_pk set t_desc = 'have a nice day' where t_id = 3;
17有关sqlserver的锁3> go
18有关sqlserver的锁(1 行受影响)
19有关sqlserver的锁

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

有关sqlserver的锁

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

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

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

看看sqlserver对堆表锁了些什么:
有关sqlserver的锁

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

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

相关文章:

  • 2021-06-26
  • 2021-10-30
  • 2021-06-17
  • 2021-07-12
  • 2021-05-26
  • 2021-12-08
  • 2022-12-23
  • 2021-10-03
猜你喜欢
  • 2021-07-09
  • 2022-12-23
  • 2021-07-06
  • 2021-07-18
  • 2022-01-19
  • 2022-12-23
  • 2021-11-20
相关资源
相似解决方案