mysql處理高並發,防止庫存超賣

來源:互聯網
上載者:User

標籤:

先來就庫存超賣的問題作描述:一般電子商務網站都會遇到如團購、秒殺、特價之類的活動,而這樣的活動有一個共同的特點就是訪問量激增、上千甚至上萬人搶購一個商品。然而,作為活動商品,庫存肯定是很有限的,如何控制庫存不讓出現超買,以防止造成不必要的損失是眾多電子商務網站程式員頭疼的問題,這同時也是最基本的問題。

從技術方面剖析,很多人肯定會想到事務,但是事務是控制庫存超賣的必要條件,但不是充分必要條件。

舉例:

總庫存:4個商品

請求人:a、1個商品 b、2個商品 c、3個商品

程式如下:

beginTranse(開啟事務)

try{

    $result = $dbca->query(‘select amount from s_store where postID = 12345‘);

    if(result->amount > 0){

        //quantity為請求減掉的庫存數量

        $dbca->query(‘update s_store set amount = amount - quantity where postID = 12345‘);

    }

}catch($e Exception){

    rollBack(復原)

}

commit(提交事務)

以上代碼就是我們平時控制庫存寫的代碼了,大多數人都會這麼寫,看似問題不大,其實隱藏著巨大的漏洞。資料庫的訪問其實就是對磁碟檔案的訪問,資料庫中的表其實就是儲存在磁碟上的一個個檔案,甚至一個檔案包含了多張表。例如由於高並發,當前有三個使用者a、b、c三個使用者進入到了這個事務中,這個時候會產生一個共用鎖定,所以在select的時候,這三個使用者查到的庫存數量都是4個,同時還要注意,mysql innodb查到的結果是有版本控制的,再其他使用者更新沒有commit之前(也就是沒有產生新版本之前),目前使用者查到的結果依然是就版本;

然後是update,假如這三個使用者同時到達update這裡,這個時候update更新語句會把並發序列化,也就是給同時到達這裡的是三個使用者排個序,一個一個執行,並產生獨佔鎖定,在當前這個update語句commit之前,其他使用者等待執行,commit後,產生新的版本;這樣執行完後,庫存肯定為負數了。但是根據以上描述,我們修改一下代碼就不會出現超買現象了,代碼如下:

beginTranse(開啟事務)

try{

    //quantity為請求減掉的庫存數量
    $dbca->query(‘update s_store set amount = amount - quantity where postID = 12345‘);

    $result = $dbca->query(‘select amount from s_store where postID = 12345‘);

    if(result->amount < 0){

       throw new Exception(‘庫存不足‘);

    }

}catch($e Exception){

    rollBack(復原)

}

commit(提交事務)

 

另外,更簡潔的方法:

 

beginTranse(開啟事務)

try{

    //quantity為請求減掉的庫存數量
    $dbca->query(‘update s_store set amount = amount - quantity where amount>=quantity and postID = 12345‘);

}catch($e Exception){

    rollBack(復原)

}

commit(提交事務)

mysql處理高並發,防止庫存超賣

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.