MySQL鎖機制和PHP鎖機制

2022-07-19 21:18:33 字數 2041 閱讀 6154

模擬準備--如何模擬高併發訪問乙個指令碼:apache安裝檔案的bin/ab.exe可以模擬併發量 -c 模擬多少併發量 -n 一共請求多少次 http://請求的指令碼

例如:cmd: apache安裝路徑/bin/ab.exe -c 10 -n 10

【切入正題】

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 a

( id int comment '模擬100件活動商品的數量'

);insert into a values(100);

模仿:以10的併發量訪問這個指令碼! 使用apache自帶的ab.exe軟體

*/error_reporting(0);

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

mysql_select_db('test');

# mysql 鎖

mysql_query('lock table a write');// 只有乙個客戶端可以鎖定表,其他客戶端阻塞在這

$rs = mysql_query('select id from a');

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

if($id > 0)

# mysql 解鎖

mysql_query('unlock tables');

php檔案鎖示例**:

<?php

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

create table a

( id int comment '模擬100件活動商品的數量'

);insert into a values(100);

模仿:以10的併發量訪問這個指令碼! 使用apache自帶的ab.exe軟體

*/error_reporting(0);

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

mysql_select_db('test');

# php中的檔案鎖

$fp = fopen('./a.lock', 'r'); // php的檔案鎖和表沒關係,隨便乙個檔案即可

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

$rs = mysql_query('select id from a');

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

if($id > 0)

# php的檔案鎖,釋放鎖

flock($fp, lock_un);

fclose($fp);

MySQL鎖機制和PHP鎖機制

正文內容 模擬準備 如何模擬高併發訪問乙個指令碼 apache安裝檔案的bin ab.exe可以模擬併發量 c 模擬多少併發量 n 一共請求多少次 http 請求的指令碼 例如 cmd apache安裝路徑 bin ab.exe c 10 n 10mysql中的鎖 語法 lock table 表名1...

mysql鎖機制 mysql 鎖機制

一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...

mysql鎖機制 php Mysql鎖機制

表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。行級鎖 開銷大,加鎖慢 會出現死鎖 鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。共享鎖和排它鎖 頁面鎖 開銷和加鎖時間界於表鎖和行鎖之間 會出現死鎖 鎖定粒度界於表鎖和行鎖之間,併發度一般 mysql的行級鎖有...