您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎么在PHP中使用Mysql鎖解決高并發(fā)問題,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
創(chuàng)建庫存管理表
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
創(chuàng)建訂單管理表
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); } }
我們預(yù)置庫存是十個(gè),然后執(zhí)行ab測試查看結(jié)果
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個(gè),而庫存表的庫存也減到了-2,這顯然不符合實(shí)際邏輯的;
下面我們來看利用數(shù)據(jù)庫行鎖來解決這個(gè)問題
修改代碼如下
$pdo = new PDO('mysql:host=127.0.0.1;port=3306; dbname=test','root','123456'); $pdo->beginTransaction();//開啟事務(wù) $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();//提交事務(wù) } else { $pdo->rollBack();//回滾 } } else { $pdo->rollBack();//回滾 } }
查看結(jié)果
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鎖之后,對庫存進(jìn)行了有效的控制,很好的解決了第一段代碼里面,因?yàn)椴l(fā)引起的一些邏輯性的問題
關(guān)于怎么在PHP中使用Mysql鎖解決高并發(fā)問題就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。