现在有一场景要用到这样一个字段,
值为 0-999 递增数值。以天为条件值唯一
后一记录在前一个记录的值上加 1.直到 999 结束
我现在是每次存入数据库之前查询最后一条记录的值+1 ,
今天出现在两个相同的值,
怎么防止两个查询同时进行而产生的相同的值?
不能用自增,因为
1
faceair 2015-09-15 22:08:31 +08:00 1
用联合索引约束
|
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 1
表要设置唯一字段, Unique key (s )
|
5
wy315700 2015-09-15 23:20:58 +08:00 1
联合自增
|
6
flowfire 2015-09-15 23:29:01 +08:00
为何不加锁。。。
|
7
Kilerd 2015-09-16 00:13:42 +08:00 via Android
加锁就好,
|
8
realpg 2015-09-16 00:27:02 +08:00
记得前两天有过类似的一个帖子
说是一天产生 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
和提交数量根本无关,只要有两个并发你这就会出事
话说一半,为什么不能用自增呢 |