现在有一场景要用到这样一个字段,
值为 0-999 递增数值。以天为条件值唯一
后一记录在前一个记录的值上加 1.直到 999 结束
我现在是每次存入数据库之前查询最后一条记录的值+1 ,
今天出现在两个相同的值,
怎么防止两个查询同时进行而产生的相同的值?
不能用自增,因为
![]() | 1 faceair 2015-09-15 22:08:31 +08:00 ![]() 用联合索引约束 |
![]() | 3 faceair 2015-09-15 23:12:53 +08:00 比如你的数据库里面有两个字段 一个叫 day_id 一个叫 day 在数据库里面加个 day_day_id 的联合索引能保证这两个字段联合起来的数据是唯一的 具体怎么加你可以再去查查 这样的话 同时查询的时候会有一个查询失败 一个成功 失败的重新再另行处理 |
4 lavadore 2015-09-15 23:19:00 +08:00 ![]() 表要设置唯一字段, Unique key (s ) |
![]() | 5 wy315700 2015-09-15 23:20:58 +08:00 ![]() 联合自增 |
![]() | 6 flowfire 2015-09-15 23:29:01 +08:00 为何不加锁。。。 |
![]() | 7 Kilerd 2015-09-16 00:13:42 +08:00 via Android 加锁就好, |
![]() | 8 realpg PRO 记得前两天有过类似的一个帖子 说是一天产生 0~999 的流水号的 如果那个帖子是楼主的 那么,一天 86400 秒才产生 999 个流水号的业务 你需要 lock tables `table_name` write; |
![]() | 9 xvxv 2015-09-16 00:41:46 +08:00 |
![]() | 10 ljbha007 2015-09-16 00:53:17 +08:00 锁表就行了 |
![]() | 11 msg7086 2015-09-16 03:08:27 +08:00 写锁 索引 触发器 基本就这 3 种做法吧。 |
12 feiyuanqiu 2015-09-16 03:42:13 +08:00 via iPhone |
![]() | 13 loading 2015-09-16 05:50:47 +08:00 via Android 将这个数字放到程序的全局变量,如果你只有一个线程的话。 |
![]() | 14 flydogs 2015-09-16 08:11:15 +08:00 小处理,弄一个临时表(一个自增字段)是最简单的。 |
![]() | 15 codercai 2015-09-16 08:52:38 +08:00 这不就是类似线程同步么,加锁撒 |
16 likai OP @feiyuanqiu 你错怪我了。回复我都看过,只是因为自己对这一块本身不熟,又缺少学习的时间,一天时间。从前端 页面适配(微信小应用)到后台管理这一块的数据(网站的一个小模块),全是我一个人,所以选择了这么一个方法,当初其实我也没想到一个一天访问量不到 500 的小应用会出现这种情况。(技术水平太次了)、还没作完就移交给一华为出来的小伙伴来作了,我改作其它去了,他发现并提出过这个问题,不知道为什么却没有更改这一处的设计,移交给客户之后。昨天一天才 350 的提交。就出现同值情况了,然后然后。因为我手头的事情作完了。那哥们出差了。就又回到我手上了。就出现了上面我发的问题了。 好吧。我是在为自己开脱找理由,有什么办法在不影响前面数组的情况下解决这个问题呢。向大牛们前辈们求助。 |
![]() | 17 ryd994 2015-09-17 07:08:01 +08:00 via Android 和提交数量根本无关,只要有两个并发你这就会出事 话说一半,为什么不能用自增呢 |