首頁  >  文章  >  資料庫  >  MySQL鎖機制與PHP鎖機制

MySQL鎖機制與PHP鎖機制

巴扎黑
巴扎黑原創
2016-12-07 14:00:07874瀏覽

模擬準備--如何模擬高並發存取一個腳本:apache安裝檔的bin/ab.exe可以模擬並發量-c 模擬多少並發量-n 一共請求多少次http://請求的腳本
例如:cmd: apache安裝路徑/bin/ab.exe -c 10 -n 10 http://web.test.com/test.php

【切入正題】
MYSQL中的鎖:
語法:
LOCK TABLE 表名1 READ |WRITE, 表名2 READ|WRITE .................. 【鎖表】
UNLOCK TABLES  【釋放表】


Read:讀鎖|共享鎖定: 所有的客戶端只能讀這個表不能寫這個表
Write:寫鎖|排它鎖: 所有目前鎖定客戶端可以操作這個表,其他客戶端只能阻塞
注意:在鎖表的過程中只能操作被鎖定的表,如果要操作其他表,必須把所有要操作的表都鎖起來!

PHP中的文件鎖定 (鎖的是文件,不是表)
文件鎖的文件與表有什麼關係? :一點關係也沒有,跟令牌相似,誰拿到誰來操作。所以表根本沒鎖。
測試時,有個文件就行,叫什麼名無所謂

總結:
項目中應該只使用PHP中的文件鎖,盡量避免鎖表,因為如果表被鎖定了,那麼整個網站中所有和這個表相關的功能都被拖慢了(例如:前台很多用戶一直下訂單,商品表mysql鎖表,其他與商品表相關的操作一直處於阻塞狀態【讀不出來商品表】,因為一個功能把整個網站速度拖慢)。

我的一個項目就是O2O外賣,中午12-2點,晚上6點都是訂單高並發時,這種情況下,MySQL鎖顯然是不考慮的,用戶體驗太差。其實根據實際的需求,外賣可以不用設計庫存量的,當然除了秒殺活動模組還是需要php檔案鎖的。

應用場景:
1. 高並發下單時,減庫存量時要加鎖
2. 高並發搶單、搶票時要使用

MySQL鎖定範例程式碼:

Php  

MySQL8

/**

模擬秒殺活動-- 商品100件 

CREATE TABLE a 

    id a VALUES(100); 

模仿:以10的並發量訪問這個腳本!    使用apache內附的ab.exe軟體 

 */  

error_reporting(0);  

mysql_connect('localhost','root','admin123');

# mysql 鎖與$rs, 0, 0);  

if($id > 0)  

{  

    --$id; 

}  

  

# mysql 解鎖  

mysql_query('UNLOCK TABLES');  

 

PHP檔案鎖定範例碼:

Php _reporting(0);  

mysql_connect('localhost','root','admin123');  

mysql_select_db('test');  

# phpH   

# php(   

. ); // php的文件鎖定和表格沒關係,隨便一個文件即可  

flock($fp, LOCK_EX);// 排他鎖  


  

$id = mysql_result($rs, 0, 0);  

if($id > 0)  

{  

DATE a SET id='.$id);

}  

# php的文件鎖,釋放鎖  

flock($fp, LOCK_UN);  

fclose($fp);

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn