解决同步登录主键冲突问题

DROP PROCEDURE FetchNewSegment
GO
CREATE PROC FetchNewSegment
@SegmentID INT OUT,
@CurID INT OUT,
@MaxID INT OUT,
@KeepSeconds INT
AS
BEGIN
DECLARE @MinID INT
DECLARE @RetryTimes INT
DECLARE @UpdateCount INT
DECLARE @CSegmentCount INT
SET @CSegmentCount = ISNULL((SELECT COUNT(MT_0.SegmentID) AS MT_0_SegmentID_COUNT FROM Segment AS MT_0 ), 0) 
SET @RetryTimes = 100

WHILE (@RetryTimes > 0)
BEGIN
SET @SegmentID = (FLOOR((RAND() * ((@CSegmentCount - 1000)))) + 1000);
IF EXISTS(SELECT TOP 1 MT_0.SegmentID AS MT_0_SegmentID_EXIST FROM Segment AS MT_0 WHERE (MT_0.SegmentID = @SegmentID)) 
BEGIN
UPDATE Segment SET
[OverDueTime] = DATEADD(SECOND, @KeepSeconds, GETDATE())
WHERE (((Segment.SegmentID = @SegmentID)) AND (NOT Segment.IsUseout = 1 AND (((Segment.OverDueTime IS NULL) OR (Segment.OverDueTime < GETDATE())) AND NOT EXISTS(SELECT TOP 1 MT_0.SegmentID AS MT_0_SegmentID_EXIST FROM LoginInfo AS MT_0 WHERE (MT_0.SegmentID = Segment.SegmentID)) )));
SET @UpdateCount = @@ROWCOUNT;
IF (@UpdateCount > 0)
BEGIN
SELECT @CurID = Segment.CurID,@MaxID = Segment.MaxID
FROM Segment
WHERE (Segment.SegmentID = @SegmentID);
BREAK
END
END
ELSE
BEGIN TRY
SET @MinID = ((((@SegmentID - 1)) * 10000) + 1)
SET @CurID = @MinID
SET @MaxID = (@SegmentID * 10000)

INSERT INTO Segment
(SegmentID, MinID, MaxID, CurID, IsUseout, OverDueTime)
SELECT @SegmentID AS SegmentID, @MinID AS MinID, @MaxID AS MaxID, @CurID AS CurID, CAST(0 AS BIT) AS IsUseOut, DATEADD(SECOND, @KeepSeconds, GETDATE()) AS OverDueTime

SET @UpdateCount = 1
BREAK
END TRY
BEGIN CATCH
SET @UpdateCount = 0
END CATCH;
SET @RetryTimes = (@RetryTimes - 1)
END

IF (@UpdateCount = 0)
BEGIN
SET @SegmentID = Null;
SET @CurID = Null;
SET @MaxID = Null
END
END
GO

 

转载于:https://www.cnblogs.com/fanzf/p/5584145.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值