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

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

时间: 2024-08-11 18:39:01

解决同步登录主键冲突问题的相关文章

sql解决主键冲突

在数据插入的时候,假设主键对应的值已经存在,则插入失败!这就是主键冲突.当主键存在冲突(duplicate key)的时候,可以选择性的进行处理,即忽略.更新或者替换. 1.忽略 insert ignore into table 保持原记录,忽略新插入的记录 2.替换 replace into table 替换原记录,即先删除原记录,再插入新的记录 3. 更新 insert into table value("xx","xx") ON DUPLICATE KEY U

13.MySQL解决主键冲突

1.准备 1 CREATE DATABASE mahaiwuji; 2 USE mahaiwuji; 3 ? 4 CREATE TABLE emp 5 ( 6 empno INT PRIMARY KEY, 7 ename VARCHAR(10), 8 sal INT 9 ) ENGINE = INNODB DEFAULT CHARSET = utf8; 10 ? 11 INSERT INTO emp VALUES (1,'smith',2800); 12 INSERT INTO emp VALU

mysql主从之主键冲突

收到短信报警,两台数据库都报slave同步失败了,先说明一下环境,架构:lvs+keepalived+amoeba+mysql,主主复制,单台写入, 主1:192.168.0.223(写) 主2:192.168.0.230 好吧,先show slave status \G看一下同步失败的具体报错吧 登录主2库查看: mysql> show slave status \G *************************** 1. row ***************************

MySQL 复制 主键冲突

看了下复制的问题,最明显的一个案例就是主键冲突,今天就看下这个问题 什么原因会导致这个问题 怎么规避这个问题 一.什么原因导致 网上最多的说就是:对于存在auto_increment字段或者unique索引字段,使用replace into操作或者主从切换,因为replace into对于auto或者unique字段会进行删除再做插入 执行replace into t values(1,2)被删除和被插入的行数的和(大于或者等于1) master 上 SHOW CREATE TABLE `tes

[转]主键冲突的话就更新否则插入 (ON DUPLICATE KEY UPDATE )

mysql "ON DUPLICATE KEY UPDATE" 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不会导致唯一值列重复的问题,则插入新行. 例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果: INSERT INTO TABLE (a,c) VALUES (1,3) ON D

解决MySQL复合主键下ON DUPLICATE KEY UPDATE语句失效问题

先描述一下这个问题的起因,假设有一张表,里面保存了交易订单,每张订单有唯一的ID,有最后更新时间,还有数据,详情如下: +-------+----------+------+-----+---------------------+-------+ | Field | Type     | Null | Key | Default             | Extra | +-------+----------+------+-----+---------------------+-------

多线程调用生成主键流水号存储过程产生主键冲突问题解决方案

遇到开发多线程测试插入数据的时候发现主键冲突问题 问题具体描述如下: -------------------------------------------------------------- 调用Procedure_insert Procedure_insert Begin Call procedure(获取流水号) Insert into table values(流水号作为id,其他列); End 流水号存储过程: Update 统计表 统计字段+1 Update 统计表 最终流水号 s

mysql修改数据 -- 主键冲突

mysql 插入数据唯一键冲突 前提: 修改数据三种可用的方法解决主键冲突的问题 1. insert into ... on duplicate key update set ... 2. update ... set = case key when ... then ... when ... then ... else end where ...; 3. replace into ... (与1相似,但若主键冲突会先删除原数据,后再插入新数据 ,所以运用时最好带上主键) 例: table :

UPDATE 时主键冲突引发的思考【转】

假设有一个表,结构如下: root@localhost : yayun 22:59:43> create table t1 ( -> id int unsigned not null auto_increment, -> id2 int unsigned not null default '0', -> primary key (id) -> )engine=myisam; Query OK, 0 rows affected (0.00 sec) root@localhost