用額外的單程序處理一個佇列,下單請求放到佇列裡,一個個處理,就不會有併發的問題了,但是要額外的開啟後臺程序以及延遲問題,這裡暫不予考慮。這裡我們可使用訊息佇列,我們常用到Memcacheq、Radis。
mysql樂觀鎖,意思是比如總庫存是2,搶購事件提交時,立馬將庫存+1,那麼此時庫存是3,然後訂單生成後,在更新庫存前再查詢一次庫存(因為訂單生成理所當然庫存-1,但是先不急,再查一次庫存返回結果是3),看看跟預期的庫存數量(這裡預期的庫存是3)是否保持一致,不一致就回滾,提示使用者庫存不足。
樂觀鎖的特點先進行業務操作,不到萬不得已不去拿鎖。即“樂觀”的認為拿鎖多半是會成功的,因此在進行完業務操作需要實際更新資料的最後一步再去拿一下鎖就好。樂觀鎖在資料庫上的實現完全是邏輯的,不需要資料庫提供特殊的支援。一般的做法是在需要鎖的資料上增加一個版本號,或者時間戳。
藉助檔案排他鎖,在處理下單請求的時候,用flock鎖定一個檔案,如果鎖定失敗說明有其他訂單正在處理,此時要麼等待要麼直接提示使用者"伺服器繁忙"
用額外的單程序處理一個佇列,下單請求放到佇列裡,一個個處理,就不會有併發的問題了,但是要額外的開啟後臺程序以及延遲問題,這裡暫不予考慮。這裡我們可使用訊息佇列,我們常用到Memcacheq、Radis。
mysql樂觀鎖,意思是比如總庫存是2,搶購事件提交時,立馬將庫存+1,那麼此時庫存是3,然後訂單生成後,在更新庫存前再查詢一次庫存(因為訂單生成理所當然庫存-1,但是先不急,再查一次庫存返回結果是3),看看跟預期的庫存數量(這裡預期的庫存是3)是否保持一致,不一致就回滾,提示使用者庫存不足。
樂觀鎖的特點先進行業務操作,不到萬不得已不去拿鎖。即“樂觀”的認為拿鎖多半是會成功的,因此在進行完業務操作需要實際更新資料的最後一步再去拿一下鎖就好。樂觀鎖在資料庫上的實現完全是邏輯的,不需要資料庫提供特殊的支援。一般的做法是在需要鎖的資料上增加一個版本號,或者時間戳。
藉助檔案排他鎖,在處理下單請求的時候,用flock鎖定一個檔案,如果鎖定失敗說明有其他訂單正在處理,此時要麼等待要麼直接提示使用者"伺服器繁忙"