查看sql server update时,是行锁还是表锁

https://bbs.csdn.net/topics/120000749

http://www.cnblogs.com/s021368/articles/2148659.html

问题:

udpate a
set column1 = 1
where idx = 1
sqlserver 执行update语句的时候,是锁整张表的吧

分析:

看表结构, 如果没有主键无法只锁定行

如果楼主要验证的话, 只需要类似下面的方法就行了:

--   开事务,   以保持锁 
BEGIN   TRAN 

--   更新 
update  a   
set   column1   =   1   
where   idx   =   1 

--   列出锁信息 
EXEC   sp_lock   @@spid 

--   提交或者回滚事务 
COMMIT/ROLLBACK   TRAN

SELECT * FROM SysObjects  where id = 2099048 --查看表名

SELECT   *   FROM   table   WITH   (HOLDLOCK)   --其他事务可以读取表,但不能更新删除   

SELECT   *   FROM   table   WITH   (TABLOCKX)  -- 其他事务不能读取表,更新和删除

输出的结果大致是这样:

通过 dbid, ObjId 可以找到你更新的表相关的锁记录
SELECT * FROM SysObjects where id = @ObjId 可以看到表名

如果 IndId 为 0 , 表示锁在表上, 否则在对应的索引上
通过 Type 列, 可以确定被锁定的是行/表, 或者是其他, 并且可以通过 Mode 看到是什么锁
在Status 中, 还可以看到锁是已经加上了, 还是在等待其他资源释放(以取得加锁的权利)

spid dbid ObjId IndId Type Resource Mode Status


53 1 1115151018 0 TAB IS GRANT

锁的类型(Tyep 列值, RID 和 KEY 的话, 表示锁在行上) 有如下几种:
RID = 表中单个行的锁,由行标识符 (RID) 标识。
KEY = 索引内保护可串行事务中一系列键的锁。
PAG = 数据页或索引页的锁。
EXT = 对某区的锁。
TAB = 整个表(包括所有数据和索引)的锁。
DB = 数据库的锁。
FIL = 数据库文件的锁。
APP = 指定的应用程序资源的锁。
MD = 元数据或目录信息的锁。
HBT = 堆或 B 树索引的锁。在 SQL Server 2005 中此信息不完整。
AU = 分配单元的锁。在 SQL Server 2005 中此信息不完整。

下面的方法,有助于将死锁减至最少(详细情况,请看SQLServer联机帮助,搜索:将死锁减至最少即可)。

· 按同一顺序访问对象。
  · 避免事务中的用户交互。
  · 保持事务简短并处于一个批处理中。
  · 使用较低的隔离级别。
  · 使用基于行版本控制的隔离级别。
  - 将 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON,使得已提交读事务使用行版本控制。
  - 使用快照隔离。
  · 使用绑定连接。

你可能感兴趣的:(查看sql server update时,是行锁还是表锁)