需求:
根据某个字段的标记,来判断要拿到的记录sn,再更新此条记录的标记,防止被别的记录拿到
要解决的问题:
总有那一个瞬间,2个线程同时拿到同一条记录
解决方法:
使用排它锁,下面为实例,好用请给好评。何谓排它锁请自行百度。
关键语法是:
with (tablockx)
原理:
从使用with(tablockx)开始就独占了,知道commit tran才释放锁
下面是实例:
ALTER PROCEDURE [dbo].[存储过程-获取SN(RobotInput已上传工单等待Center获取并持续刷新显示)]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
declare @getSN int
begin tran--声明显式事务
--=================================
select top 1 @getSN=sn
from [识别流水表] with (tablockx)
where
[识别进度]='RobotInput已上传工单等待Center获取并持续刷新显示' and
[识别结果] is null order by sn asc;
if(@getSN is not null)
BEGIN
update [识别流水表] set [识别进度]='Center获取并持续刷新显示' where sn=@getSN
END
ELSE
BEGIN
set @getSN=-1;
END
--=================================
commit tran--提交显式事务
select @getSN as [getSN];
END