1.排它锁
在一个Sql连接中这样写:
begin tran
--select * from a with(UPDLOCK)
update a set [name]='wq' where [id]=2 --这里的set的值不能不变(即不能本来name='wq'又set name='wq'),否则Sql Server会优化
成不加锁
waitfor delay '00:00:08'
commit tran
在另外一个sql连接中这样写:
select * from a
发现第二个连接里的sql语句必须等到第一个连接里的事务完成才执行完成,这是因为第一个连接里的update语句自动加了独占锁
2.Sql Server 默认锁
即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁。
Select语句:1.当事务的隔离级别为 READ committed,READ uncommitted 时为不加锁,既unlock
2.当事务的隔离级别为 REPEATABLE READ,SERIALIZABLE时,为共享锁,既HoldLock
4.关于更新锁
在一个Sql连接中这样写:
begin tran
begin tran
select * from a with(updlock) where [id] in (2,3,4)
waitfor delay '00:00:04'
commit tran
在另外一个sql连接中这样写:
select * from a with(updlock) where [id] =4
发现第二个连接里的sql语句必须等到第一个连接里的事务完成才执行完成,这是因为第二个连接的更新锁认为第一个连接里的更新锁可能会进行修改
转换为排它锁,所以要等第一个连接的事务执行完成才执行。如果第二个连接里的sql语句这样写:select * from a with(holdlock) where [id]
=4,则不不用等第一个连接事务执行完毕才执行。