MSSQL怎样实现行锁控制?(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行锁控制可以通过悲观锁来保证数据的一致性,乐观锁则可以以更优化的性能实现数据的一致性。


数据运维技术 » MSSQL怎样实现行锁控制?(mssql 锁定行)