PHP+MYsql 数据库后一条记录以前一条记录的某个值+1,怎么防止添加时出现两个相同的值 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
likai
V2EX    PHP

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

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

    现在有一场景要用到这样一个字段,
    值为 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  
    PRO
       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     Solana     5533 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 09:00 PVG 17:00 LAX 02:00 JFK 05:00
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86