MSSQL怎样实现行锁控制?

MSSQL行锁控制是为了保证在并发的情况下对数据的一致性。MSSQL中实现行锁控制,有两种方法:和使用悲观锁和乐观锁。

首先需要熟习MSSQL中提供的几个事务模式,read committed(读取已提交)、repeatable read(可重复读取)、serializable(可序列化)等。

悲观锁(Pessimistic Lock):指的是当开发人员假定事务是不可控的,总是会产生冲突的时候,就采取悲观的态度,立即让每行 truncate 时加上锁,以此来避免事务间的冲突。这里可以用SELECT…WITH(X)或SELECT…WITH(U)来实现,其中X表示排他锁,U表示更新锁。

最简单的用法示例以下:

begin transaction

select * from [table] with (x)

commit

此时,只要一个事务对某行数据获得锁,那末别的事务就不能对这行数据进行修改,直到这个事务释放锁,其他事务才能访问并修改这行数据。悲观锁不但可以用在SELECT语句上,其实, DELETE 或 UPDATE 语句时也可以使用此类锁。

乐观锁(Optimistic Lock):指的是当开发人员以为事务是可控的,不会产生冲突的时候,就采取乐观的对待,在更新或删除数据之前,先检查一遍有无产生改变,如果产生改变,就报错,这样就不会产生破坏性写入,到达数据一致性保障的效果。

乐观锁也可用SELECT…WITH(XLOCK), WITH(UPDLOCK)或WITH(HOLDLOCK)来实现, 其中XLOCK表示排他锁, UPDLOCK表示更新锁, HOLDLOCK表示保持锁。

最简单的用法示例以下:

begin transaction

select * from [table] with (x)

if @@rowcount = 0

insert into [table]

commit

此时,一个事务负责先查询出记录(查询锁),如果它发现记录不存在了,那末就插入(更新锁),在插入终了之前,会锁定查询结果,让别的事务没法修改,直到事务结束后才会释放锁。

总的来讲,MSSQL行锁控制可以通过悲观锁来保证数据的一致性,乐观锁则可以以更优化的性能实现数据的一致性。

THE END