1. 程式人生 > >利用mysql事務隔離級別解決php高併發問題

利用mysql事務隔離級別解決php高併發問題

此方法可能不太完美,但是能在一定程度上解決高併發問題。本文以高併發搶單來舉例。

首先科普一下mysql隔離級別

mysql有四個隔離級別:

Read Uncommitted(讀取未提交內容)
Read Committed(讀取提交內容)
Repeatable Read(可重讀)
Serializable(可序列化)

每個隔離級別的具體特點,大家可以再具體百度。我只知道如何使用,沒有深入研究,就不誤導大家了。

php高併發解決方案:

網上搜了好多,大概有以下幾種方案

1 請求訊息佇列(MemcacheQ訊息佇列等),先來的請求先處理,後來的直接告訴使用者訂單已被搶(單個商品)或引導到商品已被搶完的頁面(多個商品)。

2 Memcache鎖,實現類似java的同步程式碼塊的效果

3 檔案鎖實現程式碼同步

4 mysql事務隔離鎖表。

本文討論第四種

這種方法,肯定要對資料庫開啟事務的。如果把mysql的事務隔離級別設定為 Serializable (SET SESSION TRANSACTION ISOLATION LEVEL serializable),此隔離級別強制事務排序,需要等一個事務處理完再處理下一個,而在事務中,我們可以判斷一下訂單的狀態,這樣當第一個事務提交後,第二個事務處理時訂單狀態已變,直接回滾。