查看: 1233|回复: 5
|
PHP Mysql - 用户同时下单
[复制链接]
|
|
想问用户同时下单, 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) 是自学的, 半桶水。。。。 |
|
|
|
|
|
|
|
发表于 23-11-2016 02:19 AM
|
显示全部楼层
試看加一個field/column -StockAvailable/Balance, 然後根據這個來跟蹤存貨.我本身的看法是database的理解強了,SQL也會比較容易上手.可以找一些SQL的入門書本來看看.
很多學院的database的考題都不錯,你可以看看.
|
|
|
|
|
|
|
|
发表于 24-11-2016 11:47 AM
|
显示全部楼层
多开一个table来放那些serial number和放status |
评分
-
查看全部评分
|
|
|
|
|
|
|
楼主 |
发表于 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
|
显示全部楼层
用户同时下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的關係就是一對多,這個沒有問題,
- 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, 例如
- 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.
這時就看你細心到什麽程度了。
|
评分
-
查看全部评分
|
|
|
|
|
|
| |
本周最热论坛帖子
|