佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1233|回复: 5

PHP Mysql - 用户同时下单

[复制链接]
发表于 22-11-2016 09:52 AM | 显示全部楼层 |阅读模式
想问用户同时下单, mysql应该要怎样 query?
情况是这样,
假设我的产品 product A, 有 serial number A001, A002....A100, 共有100个不同的serial number,
当用户order就会show 那一个serial number 他得到。
如果他买5个就会有5个serial number...
Sql 应该有怎么写"如果"同时有200个人下order? 首100个quantity的订单成功,之后的就return out of stock...

*ps: 有什么教学可以提升sql的?我的programming(php/mysql) 是自学的, 半桶水。。。。
回复

使用道具 举报


ADVERTISEMENT

发表于 23-11-2016 02:19 AM | 显示全部楼层
試看加一個field/column -StockAvailable/Balance, 然後根據這個來跟蹤存貨.我本身的看法是database的理解強了,SQL也會比較容易上手.可以找一些SQL的入門書本來看看.
很多學院的database的考題都不錯,你可以看看.
回复

使用道具 举报

发表于 24-11-2016 11:47 AM | 显示全部楼层
多开一个table来放那些serial number和放status

评分

参与人数 1积分 +10 人气 +10 收起 理由
musicalangel + 10 + 10 我很赞同

查看全部评分

回复

使用道具 举报

 楼主| 发表于 29-11-2016 10:00 AM | 显示全部楼层
yan13 发表于 23-11-2016 02:19 AM
試看加一個field/column -StockAvailable/Balance, 然後根據這個來跟蹤存貨.我本身的看法是database的理解強了,SQL也會比較容易上手.可以找一些SQL的入門書本來看看.
很多學院的database的考題都不錯,你可以看看.:l ...

现在是用这个方法来check stock。。。在看着还有什么方法可以。。。学院的考题啊。。。。好的。。。找看看。。。。
回复

使用道具 举报

 楼主| 发表于 29-11-2016 10:03 AM | 显示全部楼层
路人1 发表于 24-11-2016 11:47 AM
多开一个table来放那些serial number和放status

用户同时下order时,同一个 serial number 派出去,就有问题了吧。。。用 transaction 来 lock table,可以?
回复

使用道具 举报

发表于 3-1-2017 10:02 PM | 显示全部楼层
本帖最后由 musicalangel 于 3-1-2017 10:08 PM 编辑

我贊成路人1的説法,這邊就補充一下。

首先, 你要知道, 你會有兩個table
一個是存product 的名,大小,重量, 一些所有A001, A002共有的特徵等。
我們姑且叫他products 好了, 這是所謂邏輯層

另外一個table, 就存你所説的 product serial number etc.
學術上稱作實體層.
命名上你可以自己拿捏, 例如 product_serial 是一個不錯的名字。

兩個table的關係就是一對多,這個沒有問題,
  1. products ---1--- <> ---N--- product_serial
复制代码


這邊就像你的範例説的, 一個產品 A, 在 products 就有1筆記錄。
然後有 A001 ~ A100 這在 product_serial 裏面就有100筆記錄, 然後有一個 FK point 向 product table 裏面的A.

那這邊搶購的功能就有很多方案,就看你要怎樣做。
例如 在 product_serial 的table 那邊加入 user_id的 column, default 可以為null.
這樣你create A001 ~ A100時, 這100筆記錄内的 user_id 都是 null.

有一個人搶購, 你只要簡單的query, 例如
  1. select * from `product_serial` where user_id is null limit 0,1;
复制代码


他就會跳一筆沒有人定的product serial出來。
你根據serial 來跑你下一個步驟。

如果被搶光了, 上面的query會 empty, 所以記得執行 count先, 看有沒有記錄。

transaction 跟 lock table 有他們特定的用法,你可以這樣用,但是可能會造成performence issue, 或者是 death lock 到時候要debug的時候才來頭痛找不到。

另外yan13 講的 available 則是在products 那邊加多一個column, 然後在進行搶購前先去select available 看是否是true.

當然你implement這個column, 就要在使用者成功訂購后, 進行update的動作。
這時才是使用transaction.

這邊沒有討論到racing condition 的問題,就是你連續定5個,在loop的過程是由 A005~A010
但是跑到 A007的時候, A008被人定走了。
然後loop到A008的時候可能被overwrite.
可能跳error.

這時就看你細心到什麽程度了。

评分

参与人数 1人气 +3 收起 理由
phpwebcoder + 3 谢谢分享

查看全部评分

回复

使用道具 举报

Follow Us
您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 25-4-2024 04:05 AM , Processed in 0.066799 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表