秒殺核心設計(減庫存部分)-防超賣與高并發

商品詳情頁面的靜態化,varnish加速,秒殺商品庫獨立部署服務器這種就略過不講了。只討論庫存部分的優化

mysql配置層面的優化可以參考我的這篇文章?《關于mysql innodb引擎性能優化的一點心得》

重點設計在數據庫層面。

2張表:

第一張:判重表(buy_record),該用戶有沒秒殺過該商品

字段: id, uid, goods_id, addtime

第二張表:商品表 goods

字段: goods_id ? goods_num

方案1:

start transaction;

select id from buy_record where uid=$uid and goods_id=$goods_id;

if(結果不為空)

????拋異常,回滾。

insert into buy_record。。。

if(受影響行數<=0)

????拋異常,回滾。。。

select goods_num from goods where goods_id=$good_id;

if(庫存<=0)

????拋異常,回滾。。。

update goods set goods_num=goods_num-1 where goods_id=$goods_id;

if(受影響行數<=0)

該方法在高并發下幾乎必然導致超賣。當庫存為1的時候剛好多個用戶同時?select goods_num from goods where goods_id=$good_id;此時庫存剛好大于0,做update操作的時候必然減到小于0. ?同時上面進行是否秒殺過的判重同樣會出現類似問題

方案二:

start transaction;

select id from buy_record where uid=$uid and goods_id=$goods_id?for??update?;

if(結果不為空)

????拋異常,回滾。

insert into buy_record。。。

if(受影響行數<=0)

????拋異常,回滾。。。

select goods_num from goods where goods_id=$good_id?for update?;

if(庫存<=0)

????拋異常,回滾。。。

update goods set goods_num=goods_num-1??where goods_id=$goods_id?;

if(受影響行數<=0)

????拋異常,回滾。。。

該方法有效的防止了超賣,但是在每次select的時候加上了排它鎖,每次select操作都會被堵塞?,并發性能大大降低。

方案三:????對(uid,goods_id)加唯一索引!!

start transaction;

insert into buy_record。。。

if(唯一索引報錯?)

????拋異常,已經秒過了,回滾。。。

update goods set goods_num=goods_num-1??where goods_id=$goods_id?and?goods_num>0?;

if(受影響行數<=0)

????拋異常,商品秒完了,回滾。。。

該方法完美的解決了超賣與select排它鎖導致的并發低的問題,并且4個sql縮減成2個sql語句。極大提升性能

轉載于:https://www.cnblogs.com/ExMan/p/10272861.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249821.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

go strconv

strconv是golang用來做數據類型轉換的一個庫。 介紹下strconv最常用的兩個方法, 沒有解釋語言那么自在可以str(int),int(string), 那還算簡練。 num, err : strconv.Atoi("-42") str : strconv.Itoa(-42)轉換換成bool類型. b, err : strconv.ParseBool("true&qu…

django配置templates、static、media和連接mysql數據庫

1.模板文件 # templates配置 if os.path.exists(os.path.join(BASE_DIR, templates)) is False:os.mkdir(os.path.join(BASE_DIR, templates)) TEMPLATES [{# 模板引擎&#xff0c;內置的模板引擎有&#xff1a;# 1. django.template.backends.django.DjangoTemplates# 2. dj…

vue調用順序(初學版) index.html → main.js → app.vue → index.js → components/組件 測試

關于它是怎么調用運作的&#xff1a;https://mp.csdn.net/postedit/86134414 一. 準備工作&#xff1a; 1.下載webstorm&#xff0c;安裝vue。 2.創建項目&#xff0c;cd到要放項目的文件夾下 vue init webpack vue_test 3.安裝各種包 npm install 4.運行 cd vue_test …

web開發:jquery之DOM

一、文檔結構 二、文檔操作 三、文檔操作案例 四、form表單 五、正則 六、form案例 一、文檔結構 jsvar $sup $(.sup);console.log($sup.children()); // 子們console.log($sup.parent()); // 父console.log($sup.prev()); // 上兄弟console.log($sup.next()); // 下兄弟c…

NO.8:自學python之路------并行socket網絡編程

摘要 一到放假就雜事很多&#xff0c;這次的作業比較復雜&#xff0c;做了一個周&#xff0c;進度又拖了。不過結果還不錯。 正文 粘包 在上一節中&#xff0c;如果連續發送過多數據&#xff0c;就可能發生粘包。粘包就是兩次發送的數據粘在一起被接收&#xff0c;損壞了數據的…

vue項目中主要文件的加載順序(index.html、App.vue、main.js)

先后順序&#xff1a; index.html > App.vue的export外的js代碼 > main.js > App.vue的export里面的js代碼 > Index.vue的export外的js代碼 測試的頁面代碼塊&#xff1a; 文件的加載先后順序&#xff1a; Index.vue的mounted()中的輸出沒有執行。why&#…

Http請求報頭設置(C#)

1、添加一個SetHeaderValue方法&#xff1a; public static void SetHeaderValue(WebHeaderCollection header, string name, string value) { var property typeof(WebHeaderCollection).GetProperty("InnerCollection",BindingFlags.Instance | BindingFlags.NonP…

vue-cli3使用cdn引入

1. index.html引入&#xff1a; <script src"https://cdn.bootcss.com/moment.js/2.20.1/moment.min.js"></script> <script src"https://cdn.bootcss.com/moment.js/2.20.1/locale/zh-cn.js"></script>2. vue.config.js配置&…

vue常用屬性

Vue實例常用屬性 1.數據 data:Vue 實例的數據對象 components&#xff1a;Vue實例配置局部注冊組件 1.類方法 computed:計算屬性 watch&#xff1a;偵聽屬性 filters&#xff1a;過濾器 methods:Vue實例方法 render&#xff1a;渲染函數&#xff0c;創建虛擬DOM 1.生命周期 c…

凸包算法

轉載自&#xff1a;https://blog.csdn.net/bone_ace/article/details/46239187 凸包問題的五種解法 2015年05月29日 17:58:51 閱讀數&#xff1a;33660前言&#xff1a; 首先&#xff0c;什么是凸包&#xff1f; 假設平面上有p0~p12共13個點&#xff0c;過某些點作一個多邊形&a…

一個優雅的占位圖解決方案。適用于 UITableView 和 UICollectionView。

FMListPlaceholder 項目地址&#xff1a;https://github.com/yfming93/FMListPlaceholder 一個優雅的占位圖解決方案。適用于 UITableView 和 UICollectionView。 一行代碼處理空列表占位圖邏輯 0x001 與其他的同類三方庫對比的優點&#xff1a; 首次進入列表占位圖是不顯示的。…

es7 async 前置依賴

https://stackoverflow.com/questions/33527653/babel-6-regeneratorruntime-is-not-defined 移動端 px2rem-loader 轉載于:https://www.cnblogs.com/smzd/p/10560176.html

vue中 關于$emit的用法

1、父組件可以使用 props 把數據傳給子組件。 2、子組件可以使用 $emit 觸發父組件的自定義事件。 vm.$emit( event, arg ) //觸發當前實例上的事件 vm.$on( event, fn );//監聽event事件后運行 fn&#xff1b; 例如&#xff1a;子組件&#xff1a; <template><di…

SSO閱讀有感

SSO比較詳細且理解。贊 鏈接&#xff1a;https://www.cnblogs.com/ywlaker/p/6113927.html轉載于:https://www.cnblogs.com/z1j2r3/p/9408480.html

C語言——反彈球游戲(第二階段

#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h>#define High 15 //游戲畫面尺寸 #define Width 20//全局變量 int ball_x,ball_y; //小球的坐標 int ball_vx,ball_vy; //小球的速度 int canvas[High][W…

docker運行我們的容器

docker images docker pull nginx 運行 docker images 查看Nginx鏡像是否獲取成功&#xff0c;若為如下所示即為獲取成功&#xff1a; docker run -p 8080:80 -d nginx docker run –name 容器名 -d&#xff08;后臺運行&#xff09;-p 本地端口:容器端口 -v(掛載) 掛載本地路徑…

vue-transition動畫

demo點擊顯示與消失 <div id"demo"><button v-on:click"show !show">Toggle</button><transition name"fade"><p v-if"show">hello</p></transition> </div> <script> new V…

luogu P1896 [SCOI2005]互不侵犯

去tm插頭dp 數據范圍這么小,又要求,顯然上dp 設\(f[i][j][k]\)表示放到第\(i\)行,總共放了\(j\)個那啥,第\(i\)行的格子狀態為\(k\)的方案 先預處理出一行內狀態的放置個數和格子狀態,因為那啥占據周圍一圈的格子,所以轉移時前后兩行格子狀態沒有交集的狀態轉移 #include<al…

Java String:重要到別人只能當老二的字符串類

字符串&#xff0c;是Java中最重要的類。這句肯定的推斷不是Java之父詹姆斯高斯林說的&#xff0c;而是沉默王二說的&#xff0c;因此你不必懷疑它的準確性。 關于字符串&#xff0c;有很多的面試題&#xff0c;但我總覺得理論知識繞來繞去沒多大意思。你比如說&#xff1a;Str…

vue 中slot 的具體用法

子組件 <template><div class"slotcontent"><ul><!--<slot></slot>--><li v-for"item in items">{{item.text}}</li></ul></div> </template><script>export default{data(){re…