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

2015-09-15 22:03:52 +08:00
 likai

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

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

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

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

好吧。我是在为自己开脱找理由,有什么办法在不影响前面数组的情况下解决这个问题呢。向大牛们前辈们求助。
ryd994
2015-09-17 07:08:01 +08:00
和提交数量根本无关,只要有两个并发你这就会出事
话说一半,为什么不能用自增呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/220970

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX