国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP利用Mysql鎖解決高并發的方法

2024-05-05 00:05:13
字體:
來源:轉載
供稿:網友

前面寫過利用文件鎖來處理高并發的問題的,現在我們說另外一個處理方式,利用Mysql的鎖來解決高并發的問題

先看沒有利用事務的時候并發的后果

創建庫存管理表

CREATE TABLE `storage` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `number` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

創建訂單管理表

CREATE TABLE `order` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `number` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=latin1

測試代碼

$pdo = new PDO('mysql:host=127.0.0.1;port=3306; dbname=test','root','123456');$sql="select `number` from storage where id=1 limit 1";$res = $pdo->query($sql)->fetch();$number = $res['number'];if($number>0){  $sql ="insert into `order` VALUES (null,$number)";    $order_id = $pdo->query($sql);  if($order_id)  {    $sql="update storage set `number`=`number`-1 WHERE id=1";    $pdo->query($sql);  }}

我們預置庫存是十個,然后執行ab測試查看結果

mysql> select * from storage  -> ;+----+--------+| id | number |+----+--------+| 1 |   -2 |+----+--------+1 row in set (0.00 sec)mysql> select * from `order`;+----+--------+| id | number |+----+--------+| 22 |   10 || 23 |   10 || 24 |   8 || 25 |   8 || 26 |   7 || 27 |   6 || 28 |   4 || 29 |   3 || 30 |   2 || 31 |   2 || 32 |   2 || 33 |   1 |+----+--------+12 rows in set (0.00 sec)

得到了訂單共有12個,而庫存表的庫存也減到了-2,這顯然不符合實際邏輯的;

下面我們來看利用數據庫行鎖來解決這個問題

修改代碼如下

$pdo = new PDO('mysql:host=127.0.0.1;port=3306; dbname=test','root','123456');$pdo->beginTransaction();//開啟事務$sql="select `number` from storage where id=1 for UPDATE ";//利用for update 開啟行鎖$res = $pdo->query($sql)->fetch();$number = $res['number'];if($number>0){  $sql ="insert into `order` VALUES (null,$number)";  $order_id = $pdo->query($sql);  if($order_id)  {    $sql="update storage set `number`=`number`-1 WHERE id=1";    if($pdo->query($sql))    {      $pdo->commit();//提交事務    }    else    {      $pdo->rollBack();//回滾    }  }  else  {    $pdo->rollBack();//回滾  }}

查看結果

mysql> select * from storage;+----+--------+| id | number |+----+--------+| 1 |   0 |+----+--------+1 row in set (0.00 sec)mysql> select * from `order`;+----+--------+| id | number |+----+--------+| 1 |   10 || 2 |   9 || 3 |   8 || 4 |   7 || 5 |   6 || 6 |   5 || 7 |   4 || 8 |   3 || 9 |   2 || 10 |   1 |+----+--------+10 rows in set (0.00 sec)

很明顯在利用了mysql鎖之后,對庫存進行了有效的控制,很好的解決了第一段代碼里面,因為并發引起的一些邏輯性的問題

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 新沂市| 水城县| 阿图什市| 射阳县| 淳化县| 平原县| 永顺县| 邓州市| 竹山县| 天镇县| 宣武区| 葫芦岛市| 昌黎县| 修水县| 永年县| 隆德县| 雅安市| 凤阳县| 龙游县| 南投市| 莱州市| 乌鲁木齐市| 乐东| 义马市| 富源县| 彭水| 察隅县| 浦东新区| 平远县| 盐边县| 玉田县| 中西区| 普格县| 湘阴县| 广德县| 景宁| 五华县| 五华县| 海阳市| 康平县| 韶关市|