thinkphp6使用mysql悲觀鎖解決商品超賣問題的實現(xiàn)_第1頁
thinkphp6使用mysql悲觀鎖解決商品超賣問題的實現(xiàn)_第2頁
thinkphp6使用mysql悲觀鎖解決商品超賣問題的實現(xiàn)_第3頁
thinkphp6使用mysql悲觀鎖解決商品超賣問題的實現(xiàn)_第4頁
thinkphp6使用mysql悲觀鎖解決商品超賣問題的實現(xiàn)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第thinkphp6使用mysql悲觀鎖解決商品超賣問題的實現(xiàn)悲觀鎖介紹(百科):

悲觀鎖,正如其名,它指的是對數(shù)據(jù)被外界(包括本系統(tǒng)當前的其他事務,以及來自外部系統(tǒng)的事務處理)修改持保守態(tài)度,因此,在整個數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)。悲觀鎖的實現(xiàn),往往依靠數(shù)據(jù)庫提供的鎖機制(也只有數(shù)據(jù)庫層提供的鎖機制才能真正保證數(shù)據(jù)訪問的排他性,否則,即使在本系統(tǒng)中實現(xiàn)了加鎖機制,也無法保證外部系統(tǒng)不會修改數(shù)據(jù))。

使用場景舉例:以MySQLInnoDB為例

商品goods表,假設商品的id為1,購買數(shù)量為1,status為1表示上架中,2表示下架。現(xiàn)在用戶購買此商品,在不是高并發(fā)的情況下處理邏輯是:

查找此商品的信息;

檢查商品庫存是否大于購買數(shù)量;

修改商品庫存和銷量;

上面這種場景在高并發(fā)訪問的情況下很可能會出現(xiàn)問題。如果商品庫存是100個,高并發(fā)的情況下可能會有1000個同時訪問,在到達第2步的時候,都會檢測通過。這樣會出現(xiàn)商品庫存是-900個的情況。顯然著不滿足需求?。?!

商品表結構:

CREATETABLE`goods`(

`id`int(11)unsignedNOTNULLAUTO_INCREMENT,

`name`varchar(100)COLLATEutf8_unicode_ciNOTNULLDEFAULT'',

`status`tinyint(1)NOTNULLDEFAULT'1',

`total`int(11)NOTNULLDEFAULT'0',

`sell`int(11)NOTNULLDEFAULT'100',

`price`decimal(10,2)NOTNULL,

PRIMARYKEY(`id`)

)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8COLLATE=utf8_unicode_ci;

INSERTINTO`test`.`goods`(`id`,`name`,`status`,`total`,`sell`,`price`)VALUES(1,'商品',1,0,100,15.00);

訂單表結構:

CREATETABLE`orders`(

`id`int(11)unsignedNOTNULLAUTO_INCREMENT,

`uid`int(11)NOTNULLDEFAULT'0',

`create_time`datetimeNOTNULL,

`status`tinyint(1)NOTNULLDEFAULT'1',

`goods_id`int(11)NOTNULLDEFAULT'0',

`order_no`varchar(200)COLLATEutf8_unicode_ciNOTNULLDEFAULT'',

PRIMARYKEY(`id`)

)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8COLLATE=utf8_unicode_ci;

使用悲觀鎖處理。

當我們在查詢出goods信息后就把當前的數(shù)據(jù)鎖定,直到我們修改完畢后再解鎖。那么在這個過程中,因為goods被鎖定了,就不會出現(xiàn)有第三者來對其進行修改了。

注:要使用悲觀鎖,我們必須關閉mysql數(shù)據(jù)庫的自動提交屬性,因為MySQL默認使用autocommit模式,也就是說,當你執(zhí)行一個更新操作后,MySQL會立刻將結果進行提交。thinkphp6中使用事務,手動進行提交回滾。

namespaceapp\controller;

useapp\BaseController;

usethink\facade\Db;

classTestextendsBaseController

*不加鎖

*@returnstring|void

publicfunctiontest_1()

$num=1;

$goods_id=1;

Db::startTrans();

try{

$where=[];

$where['id']=$goods_id;

$where['status']=1;

$goods_info=Db::table('goods')-where($where)-find();

if(empty($goods_info)){

return'商品不存在';

$total=$goods_info['total'];

$sell=$goods_info['sell'];

if($total$num){

return'庫存不足';

$data['total']=$total-$num;

$data['sell']=$sell+$num;

$res=Db::table('goods')-where(['id'=$goods_id])-update($data);

$order_data=[];

$order_data['uid']=rand(1000,9999);

$order_data['status']=1;

$order_data['create_time']=date('Y-m-dH:i:s');

$order_data['goods_id']=$goods_id;

$order_data['order_no']=date('YmdHis').rand(1000,10000);

$order_res=Db::table('orders')-insert($order_data);

Db::commit();

}catch(\Exception$e){

//回滾事務

Db::rollback();

echo$e-getMessage();

exit('rollback');

echo'請求成功';

*加鎖--悲觀鎖

*@returnstring|void

publicfunctiontest_2()

$num=1;

$goods_id=1;

Db::startTrans();

try{

$where=[];

$where['id']=$goods_id;

$where['status']=1;

$goods_info=Db::table('goods')-lock(true)-where($where)-find();

if(empty($goods_info)){

return'商品不存在';

$total=$goods_info['total'];

$sell=$goods_info['sell'];

if($total$num){

return'庫存不足';

$data['total']=$total-$num;

$data['sell']=$sell+$num;

$res=Db::table('goods')-where(['id'=$goods_id])-update($data);

$order_data=[];

$order_data['uid']=rand(1000,9999);

$order_data['status']=1;

$order_data['goods_id']=$goods_id;

$order_data['order_no']=date('YmdHis').rand(1000,10000);

$order_data['create_time']=date('Y-m-dH:i:s');

$order_res=Db::table('orders')-insert($order_data);

Db::commit();

}catch(\Exception$e){

//回滾事務

Db::rollback();

echo$e-getMessage();

exit('rollback');

echo'請求成功';

}

使用jmeter工具測試,創(chuàng)建線程測試組:

關于使用jmeter創(chuàng)建測試高并發(fā)例子,可查看:使用JMeter進行高并發(fā)測試_左右..的博客-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論