php併發解決方案

2022-07-24 09:33:08 字數 1165 閱讀 9441

事務不能解決併發,只能保證在乙個事務內所有操作的一致性

常見的併發處理如下:

1.悲觀鎖

為什麼叫悲觀鎖?

預設每次的執行都會發生併發

表必須是innodb型別,必須在事務中執行,加上for update 查詢的表id=10資料是,這條資料就被鎖定了,第乙個人獲得鎖,後面的人只能等待第乙個人完成事務提交後才能獲得鎖進行操作  

$this->db->begin(); //

開啟事務

try catch (\exception

$e)

2.樂觀鎖

為什麼叫樂觀鎖?

預設每次的執行都不會發生併發,只有到真正執行變更的時候檢測併發

原理是利用mysql update 原子性,也就是不論多少次併發,mysql update 只會一條一條的更新

例:

$this->db->begin(); //

開啟事務

try

catch (\exception

$e)

3.redis鎖

//

單個使用者重複提交 場景

$haslock = $this->redis->set($key . '使用者唯一標識', 1, 'nx', 'ex', $expire

);if (!$haslock)

//併發場景

$haslock = $this->redis->set($key, 1, 'nx', 'ex', $expire

);if (!$haslock)

sleep(5);

// 處理完業務 解鎖

$this->redis->del($key);

4.redis佇列

以上方法都不是真正意義上的併發,都是強制使用者排隊乙個乙個的來,而redis 佇列可以實現真正的併發

根據具體業務的提前使用$this->redis->lpush(); 將需要併發的紅包或者商品lpush入列,併發的時候lpop出列,因為lpop是原子性操作所以不會發生超賣或超領情況

5.其他

redis lua指令碼、redis事務、中介軟體 等

php高併發解決方案

最近在做乙個 專案,遇到個問題,就是在搶購 秒殺 等活動時,庫存數量有限,但是同時下單人數超過了庫存數量,就會導致商品超售問題。那麼我們怎麼來解決這個問題呢,我的思路如下 sql1 查詢商品庫存 if 庫存數量 0 當沒有併發時,上面的流程看起來是如此完美,假設同時兩個人下單,而庫存只有1個了,在s...

php 高併發解決方案

最近在做乙個 專案,遇到個問題,就是在搶購 秒殺 等活動時,庫存數量有限,但是同時下單人數超過了庫存數量,就會導致商品超售問題。那麼我們怎麼來解決這個問題呢,我的思路如下 sql1 查詢商品庫存 if 庫存數量 0 當沒有併發時,上面的流程看起來是如此完美,假設同時兩個人下單,而庫存只有1個了,在s...

PHP高併發解決方案

最近在做乙個 專案,遇到個問題,就是在搶購 秒殺 等活動時,庫存數量有限,但是同時下單人數超過了庫存數量,就會導致商品超售問題。那麼我們怎麼來解決這個問題呢,我的思路如下 sql1 查詢商品庫存 if 庫存數量 0 當沒有併發時,上面的流程看起來是如此完美,假設同時兩個人下單,而庫存只有1個了,在s...