MySQL鎖機制&&PHP鎖機制,應用在哪些場景中呢?
阿新 • • 發佈:2018-08-09
write 代碼 操作 太差 總結 報告 商品 釋放 spa
文件鎖的文件與表有什麽關系?:一點關系也沒有,與令牌相似,誰拿到誰操作。所以表根本沒鎖。
測試時,有個文件就行,叫什麽名無所謂
總結:
項目中應該只使用PHP中的文件鎖,盡量避免鎖表,因為如果表被鎖定了,那麽整個網站中所有和這個表相關的功能都被拖慢了(例如:前臺很多用戶一直下訂單,商品表mysql鎖表,其他與商品表相關的操作一直處於阻塞狀態【讀不出來商品表】,因為一個功能把整個網站速度拖慢)。
比如在一個O2O外賣項目中,中午12-2點,晚上6點都是訂單高並發時,這種情況下,MySQL鎖顯然是不考慮的,用戶體驗太差。其實根據實際的需求,外賣可以不用設計庫存量的,當然除了秒殺活動模塊還是需要php文件鎖的。
應用場景:
1. 高並發下單時,減庫存量時要加鎖
2. 高並發搶單、搶票時要使用
正文內容
模擬準備--如何模擬高並發訪問一個腳本:apache安裝文件的bin/ab.exe可以模擬並發量
-c 模擬多少並發量 -n 一共請求多少次 http://請求的腳本
C:\phpStudy\Apache\bin>ab.exe -c 10 -n 10 http://localhost/try.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 /* 模擬秒殺活動-- 商品100件 CREATE TABLE ta ( id int comment ‘模擬100件活動商品的數量‘ ); INSERT INTO ta VALUES(100); 模仿:以10的並發量訪問這個腳本! 使用apache自帶的ab.exe軟件 */ // 關閉錯誤報告 error_reporting(0); $dbhost = ‘localhost:3306‘; //mysql服務器主機地址 $dbuser = ‘root‘; // mysql用戶名 $dbpass = ‘root‘; // mysql用戶名密碼 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die(‘連接失敗: ‘ . mysqli_error($conn)); } // 設置編碼,防止中文亂碼 mysqli_query($conn , "set names utf8"); mysqli_select_db( $conn, ‘temp‘ ); # mysql 鎖 mysqli_query($conn , ‘LOCK TABLE a WRITE‘);// 只有一個客戶端可以鎖定表,其他客戶端阻塞在這 $rs = mysqli_query($conn , ‘SELECT id FROM a‘); $id = mysqli_result($rs, 0, 0); if($id > 0) { --$id; mysqli_query($conn , ‘UPDATE a SET id=‘.$id); } # mysql 解鎖 mysqli_query($conn , ‘UNLOCK TABLES‘); //查詢解鎖後的id值 // $res = mysqli_query($conn , ‘SELECT id FROM ta‘); // while($row = mysqli_fetch_assoc($res)) // { // $id = $row[‘id‘]; // } // echo $id;
PHP文件鎖示例代碼:
<?php /* 模擬秒殺活動-- 商品100件 CREATE TABLE ta ( id int comment ‘模擬100件活動商品的數量‘ ); INSERT INTO ta VALUES(100); 模仿:以10的並發量訪問這個腳本! 使用apache自帶的ab.exe軟件 */ // 關閉錯誤報告 error_reporting(0); $dbhost = ‘localhost:3306‘; // mysql服務器主機地址 $dbuser = ‘root‘; // mysql用戶名 $dbpass = ‘root‘; // mysql用戶名密碼 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die(‘連接失敗: ‘ . mysqli_error($conn)); } // 設置編碼,防止中文亂碼 mysqli_query($conn , "set names utf8"); mysqli_select_db( $conn, ‘temp‘ ); # php中的文件鎖 $fp = fopen(‘./a.lock‘, ‘r‘); // php的文件鎖和表沒關系,隨便一個文件即可 flock($fp, LOCK_EX);// 排他鎖 $retval = mysqli_query($conn ,‘SELECT id FROM ta‘); while($row = mysqli_fetch_assoc($retval)) { $id = $row[‘id‘]; } if($id > 0) { --$id; mysqli_query($conn ,‘UPDATE ta SET id=‘.$id); } # php的文件鎖,釋放鎖 flock($fp, LOCK_UN); fclose($fp); // $res = mysqli_query($conn , ‘SELECT id FROM ta‘); // while($row = mysqli_fetch_assoc($res)) // { // $id = $row[‘id‘]; // } // echo $id;
文章來自於:博客
鏈接:http://www.cnblogs.com/foxy/p/9204892.html
MySQL鎖機制&&PHP鎖機制,應用在哪些場景中呢?