鎖機制
問題:當一個腳本被一個客戶端訪問都正常,但當多個客戶端同時並發訪問時,這個腳本的結果會出現不正確,這個問題需要使用鎖機制來解決。在我們這個網站中需要用到鎖的地方就是高並發下定單時減少商品庫存量時。
比如例子1:
有一個A 表里面一個ID數字:
現在寫一個腳本操作這個A表,每次訪問把ID減少:
這個腳使用AB模擬10個用戶並發訪問時會發現減少的數量並不是10:
。
例子2:在高並發下定單時如果要減少庫存量,那么庫存就會出問題:
加鎖之前:
加鎖之后:
現在有兩種鎖機制:MYSQL中的表鎖和PHP中的文件鎖。
MYSQL中的鎖
語法:LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRTIE.....
UNLOCK TABLES;
read:讀鎖(共享鎖):如果以這種方式鎖定表,那么在鎖定的過程中所有客戶端只有讀這張表
write:寫鎖(排它鎖):如果以這種方式鎖定表,那么只有鎖定這個表的客戶端可以操作這張表,其他客戶端只能操作個表直到鎖釋放為止。
注意:在鎖表的過程中只能操作鎖定的表,如果要操作多張表,需要把所有要操作的表都鎖起來。
PHP中的文件鎖
PHP鎖定的是一個文件,所以要先有一個文件。
先創建一個文件,文件的文件名和擴展名都無所謂。
文件鎖也分為排它鎖(LOCK_EX)和共享(LOCK_SH)鎖兩種。
思考:我們應該使用哪種鎖更好?
比如在下定單時我們要鎖定商品表,如果下單的人非常多,就會導致商品表一直是鎖定的狀態,那么整個網站所有的要讀商品表的功能都會阻塞無法讀出商品,把整個網站拖慢了。
而文件鎖只是鎖定了一個跟網站沒有關系的文件,對網站其他功能沒影響。
所以項目應該使用文件鎖。除非項目中一個表只能這一功能用到,其他功能不用這個表時,可以鎖定。
擴展:壓力測試(ab.exe)軟件來模擬並發請求一個腳本。