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,使得已提交读事务使用行版本控制。
- 使用快照隔离。
· 使用绑定连接。