V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
likai
V2EX  ›  PHP

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

  •  
  •   likai · 2015-09-15 22:03:52 +08:00 · 3560 次点击
    这是一个创建于 3384 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    基本就这 3 种做法吧。
    feiyuanqiu
        12
    feiyuanqiu  
       2015-09-16 03:42:13 +08:00 via iPhone
    @realpg http://www.v2ex.com/t/216055

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

    好吧。我是在为自己开脱找理由,有什么办法在不影响前面数组的情况下解决这个问题呢。向大牛们前辈们求助。
    ryd994
        17
    ryd994  
       2015-09-17 07:08:01 +08:00 via Android
    和提交数量根本无关,只要有两个并发你这就会出事
    话说一半,为什么不能用自增呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2825 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:39 · PVG 17:39 · LAX 01:39 · JFK 04:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.