在存储过程里面用下面语句插入 主键是sid,eid,type , 并发量大的时候 重复非常大,老是在提示有重复, 有什么办法控制?
begin try
if @value is not null
begin
if exists(select 1 from xxx where sid=@id and eid=@eid and type=@type)
update xxxx
else
insert into xxx
end
end try
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN
END
RAISERROR
end CATCH
------解决方案--------------------
难以想象的业务!
两个线程会生成相同主键的记录,而且你只通过事务让它们争先,是否可以理解为两者生成的非主键数据也是相同的?
如果相同,就没有冲突,就不需要事务了!
既然你无法在开始就充两个线程中划分操作范围,重复计算不能避免,那么重复保存也是可以接受的。
除了日志会增加,去掉事务后执行速度是有提高的。