码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-06-14 15:53:57      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

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

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

标签:

原文地址:http://www.cnblogs.com/fanzf/p/5584145.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!