日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

大促場(chǎng)景下庫(kù)存更新 SQL 優(yōu)化

freeflydom
2025年3月7日 10:26 本文熱度 684

本篇文章討論的大促場(chǎng)景,指雙 11、618 期間,系統(tǒng)的行為是要盡可能多地賣(mài)出商品,盡可能多地收訂單,又不能超過(guò)庫(kù)存。在這種高并發(fā)、大流量場(chǎng)景下,整個(gè)系統(tǒng)的瓶頸點(diǎn)必然在數(shù)據(jù)庫(kù)上,本篇文章就庫(kù)存更新這一場(chǎng)景下討論如何優(yōu)化事務(wù) SQL。

在文章開(kāi)始之前,我們做出如下約定:

  1. 業(yè)務(wù)服務(wù)器與數(shù)據(jù)庫(kù)服務(wù)器在同機(jī)房中;
  2. 網(wǎng)絡(luò)請(qǐng)求耗時(shí) 3ms,語(yǔ)句處理時(shí)間 0.2ms,所有操作都是成功的;
  3. 請(qǐng)求數(shù)量達(dá)到數(shù)據(jù)庫(kù)瓶頸,在此基礎(chǔ)上,TPS = 1000ms / lockTime(非鎖時(shí)間都可并發(fā)操作)。

兩種事務(wù)代碼,誰(shuí)更優(yōu)?

我們售賣(mài)一件商品的流程是什么呢?首先要先查詢(xún)一下商品是否還有庫(kù)存?如果有庫(kù)存,我們就創(chuàng)建一個(gè)訂單,商品庫(kù)存減去 1(為了方便分析,我們只討論這種比較簡(jiǎn)單的情況)。并且,我們還知道上述操作應(yīng)當(dāng)封裝在一個(gè)事務(wù)中,如果其中一步失敗了,就應(yīng)當(dāng)進(jìn)行回滾。

好的,基于上述的描述,我們有如下兩種事務(wù)代碼的編寫(xiě)方式。

寫(xiě)法 1

begin;
select stock from goods where id = 1;
if (stock > 0) {
    insert into order values(...); // 插入訂單表
    update goods set stock = stock - 1 where id = 1 and stock > 0; // 更新庫(kù)存
}
if (updateCount > 0) {
    commit;
} else {
    rollback;
}

寫(xiě)法 2

begin;
select stock from goods where id = 1;
if (stock > 0) {
    update goods set stock = stock - 1 where id = 1 and stock > 0; // 更新庫(kù)存
    insert into order values(...); // 插入訂單表
}
if (updateCount > 0) {
    commit;
} else {
    rollback;
}

兩種寫(xiě)法的區(qū)別就是一個(gè)先插入再更新,另一個(gè)是先更新再插入。仔細(xì)想一想,哪一種寫(xiě)法更優(yōu),從 TPS 的角度來(lái)考慮一下。

公布答案

第一種寫(xiě)法更優(yōu)(先插入再更新),TPS 比第二種高得多。

為什么呢?首先,我們要知道上面的每一條數(shù)據(jù)庫(kù)操作語(yǔ)句,包括最后的 commit 或者 rollback 都要由業(yè)務(wù)服務(wù)向數(shù)據(jù)庫(kù)發(fā)送網(wǎng)絡(luò)請(qǐng)求,并且要等待數(shù)據(jù)庫(kù)返回語(yǔ)句執(zhí)行結(jié)果(同步)。

還記得我們?cè)谧铋_(kāi)始做的約定嗎?在計(jì)算兩種寫(xiě)法的 TPS 之前,我再給上面的代碼加些注釋?zhuān)屇愀菀桌斫狻?/p>

  1. 業(yè)務(wù)服務(wù)器與數(shù)據(jù)庫(kù)服務(wù)器在同機(jī)房中;
  2. 網(wǎng)絡(luò)請(qǐng)求耗時(shí) 3ms,語(yǔ)句處理時(shí)間 0.2ms,所有操作都是成功的;
  3. 請(qǐng)求數(shù)量達(dá)到數(shù)據(jù)庫(kù)瓶頸,則 TPS = 1000ms / lockTime(非鎖時(shí)間都可并發(fā)操作)。

寫(xiě)法 1 注釋版

begin;
select stock from goods where id = 1;
if (stock > 0) {
    insert into order values(...); 
    update goods set stock = stock - 1 where id = 1 and stock > 0; // 行鎖開(kāi)始
}
if (updateCount > 0) {
    commit; // 網(wǎng)絡(luò)請(qǐng)求 1
} else {
    rollback;
}
// 行鎖結(jié)束

寫(xiě)法 2 注釋版

begin;
select stock from goods where id = 1;
if (stock > 0) {
    update goods set stock = stock - 1 where id = 1 and stock > 0; // 行鎖開(kāi)始
    insert into order values(...); // 網(wǎng)絡(luò)請(qǐng)求 1
}
if (updateCount > 0) {
    commit; // 網(wǎng)絡(luò)請(qǐng)求 2
} else {
    rollback;
}
// 行鎖結(jié)束

計(jì)算兩種寫(xiě)法的 TPS

在計(jì)算之前,我們還要再回顧一下關(guān)于數(shù)據(jù)庫(kù)中的基礎(chǔ)知識(shí)。

1、update 命令會(huì)施加一個(gè) X 型記錄鎖,X 型記錄鎖是寫(xiě)寫(xiě)互斥的。如果 A 事務(wù)對(duì) goods 表中 id = 1 的記錄行加了記錄鎖,B 事務(wù)想要對(duì)這行記錄加記錄鎖就會(huì)被阻塞。

2、insert 命令會(huì)施加一個(gè)插入意向鎖,但插入意向鎖是互相兼容的。如果 A 事務(wù)向 order 表 insert 一條記錄,不會(huì)影響 B 事務(wù) insert 一條記錄。

3、記錄鎖要等到事務(wù)提交之后才會(huì)釋放!

好的,基于最開(kāi)始的約定,代碼的注釋?zhuān)约盎A(chǔ)知識(shí),我們可以來(lái)計(jì)算了。

寫(xiě)法 1 的 TPS

commit 網(wǎng)絡(luò)請(qǐng)求 1 次,commit 語(yǔ)句執(zhí)行一次,我們?cè)谶@里可以先忽略語(yǔ)句執(zhí)行耗時(shí)。

TPS = 1000ms / 3ms = 333.33

寫(xiě)法 2 的 TPS

insert、commit 共兩次網(wǎng)絡(luò)請(qǐng)求,兩條語(yǔ)句執(zhí)行,我們也忽略語(yǔ)句執(zhí)行耗時(shí)。

TPS = 1000ms / 6ms = 166.67


我們可以看到兩者的 TPS 差了 2 倍。試想一下,如果事務(wù)中有更多的數(shù)據(jù)庫(kù)操作,寫(xiě)法 2 的 TPS 會(huì)進(jìn)一步降低。

繼續(xù)優(yōu)化

寫(xiě)法 1 是否還有進(jìn)一步優(yōu)化的空間呢?update 執(zhí)行成功與否數(shù)據(jù)庫(kù)是知道的,如果省去 commit 這個(gè)網(wǎng)絡(luò)請(qǐng)求,那么 TPS 是多少呢?

TPS = 1000ms / 0.2ms = 5000(0.2ms 是 commit 語(yǔ)句執(zhí)行時(shí)間)

當(dāng)然,這個(gè)優(yōu)化就要依靠你們公司的 DBA 了。

總結(jié)

當(dāng)我們?cè)诰帉?xiě)一個(gè)事務(wù)的時(shí)候,加行鎖的操作應(yīng)在不影響業(yè)務(wù)的情況下,盡可能地靠近 commit 語(yǔ)句,這樣單行記錄的行鎖時(shí)間才會(huì)更短,TPS 會(huì)更高。

?轉(zhuǎn)自https://juejin.cn/post/7266302333634215976


該文章在 2025/3/7 10:26:43 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 亚洲欧美不卡视频 | 国产精品视频露脸 | xxxx自由视频 | 视频在线观看一区 | 日本三级视频在线观看 | 欧美激情国产 | 区三区国产高清视频 | 五月激情丁香婷婷综合网 | 国产在线精品一区不卡 | 91大片淫黄大片在线天堂 | 国产一区二区三区丝袜精品 | 制服国产日韩欧美另类 | 国产在线一区二区播放精品 | 国产午夜福利在线播放 | 午夜免费啪视频观看视频 | 99sss高清在线视频网 | 私人尤物在线精品不卡 | 亚洲偷窥另类xxxxx乱室佳宾 | 亚洲成亚洲成网 | 国产v视频在线亚洲视频 | 国产制服精品一区二区视色 | 亚洲日韩中文字幕 | 国产一区精品普通话对白 | 国产精品精品国产一区二区 | 日韩女同精品一区二 | 婷婷精品在线 | 国产精品乱码高清在线 | 最近中文字幕高清字幕在线视频 | 国产98视频在线 | 亚洲精品影院 | 中文字幕精品视频在线 | 国产日韩一区美利坚 | 日韩视频网 | 亚洲人色大成年网站 | 国产人成视频在线免费观看 | 中文字幕在线不卡精品视频99 | 亚洲欧洲国产视频 | 国产日产成人免费视频在线观看 | 亚洲卡一卡二卡三乱草莓 | 欧美日韩视频在线 | 欧美人牲 |