likai
V2EX  ›  PHP

PHP+MYsql 数据库后一条记录以前一条记录的某个值+1,怎么防止添加时出现两个相同的值

  •  
  •   likai · Sep 15, 2015 · 4234 views
    This topic created in 3893 days ago, the information mentioned may be changed or developed.

    现在有一场景要用到这样一个字段,
    值为 0-999 递增数值。以天为条件值唯一
    后一记录在前一个记录的值上加 1.直到 999 结束
    我现在是每次存入数据库之前查询最后一条记录的值+1 ,
    今天出现在两个相同的值,
    怎么防止两个查询同时进行而产生的相同的值?
    不能用自增,因为

    17 replies    2015-09-17 07:08:01 +08:00
    faceair
        1
    faceair  
       Sep 15, 2015   ❤️ 1
    用联合索引约束
    likai
        2
    likai  
    OP
       Sep 15, 2015
    @faceair 能说清楚一点么。 PHP 新手求教
    faceair
        3
    faceair  
       Sep 15, 2015
    比如你的数据库里面有两个字段 一个叫 day_id 一个叫 day 在数据库里面加个 day_day_id 的联合索引能保证这两个字段联合起来的数据是唯一的 具体怎么加你可以再去查查
    这样的话 同时查询的时候会有一个查询失败 一个成功 失败的重新再另行处理
    lavadore
        4
    lavadore  
       Sep 15, 2015   ❤️ 1
    表要设置唯一字段, Unique key (s )
    wy315700
        5
    wy315700  
       Sep 15, 2015   ❤️ 1
    联合自增
    flowfire
        6
    flowfire  
       Sep 15, 2015
    为何不加锁。。。
    Kilerd
        7
    Kilerd  
       Sep 16, 2015 via Android
    加锁就好,
    realpg
        8
    realpg  
    PRO
       Sep 16, 2015
    记得前两天有过类似的一个帖子
    说是一天产生 0~999 的流水号的
    如果那个帖子是楼主的
    那么,一天 86400 秒才产生 999 个流水号的业务
    你需要
    lock tables `table_name` write;
    xvxv
        9
    xvxv  
       Sep 16, 2015
    以前项目遇到一个跟你类似的问题,直接使用 mysql 的触发器进行解决。

    类似方案如下:
    DROP TRIGGER IF EXISTS `xxx`;
    delimiter ;;

    CREATE TRIGGER `generateNumber` BEFORE INSERT ON `tableName` FOR EACH ROW BEGIN
    SET @tmp = select max (number ) from xxx
    SET NEW.number = @tmp + 1;

    END IF;
    END
    ;;
    delimiter ;
    ljbha007
        10
    ljbha007  
       Sep 16, 2015
    锁表就行了
    msg7086
        11
    msg7086  
       Sep 16, 2015
    写锁
    索引
    触发器

    基本就这 3 种做法吧。
    feiyuanqiu
        12
    feiyuanqiu  
       Sep 16, 2015 via iPhone
    @realpg http://www.v2ex.com/t/216055

    这个楼主属于发帖之后不看回复的类型,二十天前一堆人就给各种解决方案,现在还在问
    loading
        13
    loading  
       Sep 16, 2015 via Android
    将这个数字放到程序的全局变量,如果你只有一个线程的话。
    flydogs
        14
    flydogs  
       Sep 16, 2015
    小处理,弄一个临时表(一个自增字段)是最简单的。
    codercai
        15
    codercai  
       Sep 16, 2015
    这不就是类似线程同步么,加锁撒
    likai
        16
    likai  
    OP
       Sep 16, 2015
    @feiyuanqiu 你错怪我了。回复我都看过,只是因为自己对这一块本身不熟,又缺少学习的时间,一天时间。从前端 页面适配(微信小应用)到后台管理这一块的数据(网站的一个小模块),全是我一个人,所以选择了这么一个方法,当初其实我也没想到一个一天访问量不到 500 的小应用会出现这种情况。(技术水平太次了)、还没作完就移交给一华为出来的小伙伴来作了,我改作其它去了,他发现并提出过这个问题,不知道为什么却没有更改这一处的设计,移交给客户之后。昨天一天才 350 的提交。就出现同值情况了,然后然后。因为我手头的事情作完了。那哥们出差了。就又回到我手上了。就出现了上面我发的问题了。

    好吧。我是在为自己开脱找理由,有什么办法在不影响前面数组的情况下解决这个问题呢。向大牛们前辈们求助。
    ryd994
        17
    ryd994  
       Sep 17, 2015 via Android
    和提交数量根本无关,只要有两个并发你这就会出事
    话说一半,为什么不能用自增呢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   933 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 19:29 · PVG 03:29 · LAX 12:29 · JFK 15:29
    ♥ Do have faith in what you're doing.