事務不能解決併發,只能保證在乙個事務內所有操作的一致性
常見的併發處理如下:
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...