国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Mysql的鎖機制與PHP文件鎖處理高并發(fā)簡單思路

sunsmell / 2554人閱讀

摘要:以購買商品舉例從數(shù)據(jù)庫獲取庫存的數(shù)量。這里暫時就不測試了,下面會針對并發(fā)的處理給出測試結(jié)果。第二種方案,使用的文件鎖。特點當調(diào)用鎖一個文件時,如果沒有獲取鎖,直接返回,不會出現(xiàn)阻塞。的表鎖和的文件鎖在應(yīng)對并發(fā)數(shù)量上也有差別,自己可以多測試。

以購買商品舉例:

① 從數(shù)據(jù)庫獲取庫存的數(shù)量。
② 檢查一下庫存的數(shù)量是否充足。
③ 庫存的數(shù)量減去買家購買的數(shù)量(以每個用戶購買一個為例)。
④ 最后完成購買。

僅僅這幾行邏輯代碼在并發(fā)的情況下會出現(xiàn)問題,自己可以想象一下。
這里暫時就不測試了,下面會針對并發(fā)的處理給出測試結(jié)果。
創(chuàng)建表:

CREATE TABLE `warehouse` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT "id",
  `stock` int(11) NOT NULL DEFAULT "0" COMMENT "庫存",
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

第一種方案,使用Mysql的鎖(跟表引擎沒有關(guān)系)。
共享鎖:所有人可以讀一個資源,但只有獲取鎖的人可以操作;
排它鎖:只有獲得所的對象可以操作資源,其他的不能操作,讀都不可以。
語法:

LOCK TABLE a READ,b WRITE,c READ,d WRITE;(可以鎖多張表,在鎖表的過程中只能操作被鎖的表,不能操作其他表)。
UNLOCK TABLES;(釋放表)。
@$mysql = mysql_connect("localhost","root","");
mysql_query("set names utf8");
mysql_select_db("test");
mysql_query("LOCK TABLE `warehouse` WRITE");  //鎖表之后同一時間只有一個人能操作,也就是只有一個人能獲取到鎖
$sql = "SELECT `stock` FROM warehouse";
$res = mysql_query($sql);
$row= mysql_fetch_array($res);
$stock = $row[0];
if( $stock < 1) {
    die("庫存不足");
}else{
    $new_stock = intval($stock - 1);
    mysql_query("UPDATE warehouse SET `stock` = ".$new_stock);
    mysql_query("UPDATE TABLES");
}

鎖表的缺點是:會出現(xiàn)阻塞,如果同時鎖多張表的話,還會影響整個網(wǎng)站相關(guān)表的加載。
第二種方案,使用PHP的文件鎖。
特點:當調(diào)用flock鎖一個文件時,如果沒有獲取鎖,直接返回FALSE,不會出現(xiàn)阻塞。
排它鎖:flock($fp,LOCK_EX);
共享鎖:flock($fp,LOCK_SH);
釋放鎖:flock($fp,LOCK_UN);

@$mysql = mysql_connect("localhost","root","");
mysql_query("set names utf8");
mysql_select_db("test");
$fp = fopen("./lock.txt","r");
$try = 10;  //聲明一個變量表示要獲取的次數(shù),防止死循環(huán)
do{
    $lock = flock($fp, LOCK_EX);
    if(!$lock)
        usleep(5000); //如果沒有獲取到鎖,釋放CPU,休息5000毫秒
}while(!$lock && --$try >=0 );
    if($lock) {
    $sql = "SELECT `stock` FROM warehouse";
    $res = mysql_query($sql);
    $row = mysql_fetch_array($res);
    $stock = $row[0];
    if( $stock < 1) {
        die("庫存不足");
    }else{
        $new_stock = intval($stock - 1);
        mysql_query("UPDATE warehouse SET `stock` = ".$new_stock);
    }
    flock($fp, LOCK_UN);
    fclose($fp);

}else{ die("系統(tǒng)繁忙!"); }

第三種方案,簡單的SQL語句就可以避免倉庫為負數(shù)。

@$mysql = mysql_connect("localhost","root","");
mysql_query("set names utf8");
mysql_select_db("test");
mysql_query("UPDATE warehouse SET `stock` = `stock` -1 WHERE `stock` > 0");  //可以避免庫存為負數(shù)

測試的方法是,找到Apache下的ab.exe,拖入CMD終端,然后輸入指定參數(shù)測試。
具體參數(shù)說明Google一下你就知道,比如耗時之類的...這里不做詳細說明。


PS:Mysql的表鎖和PHP的文件鎖在應(yīng)對并發(fā)數(shù)量上也有差別,自己可以多測試。總之方案還有很多

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28172.html

相關(guān)文章

  • MySQL - 事務(wù)的啟動 / 設(shè)置 / / 解——入門

    摘要:行級鎖,頁級鎖,表級鎖。聞其名知其意,比較少見的是頁級鎖,它鎖定的是一組相鄰數(shù)據(jù)。排他鎖允許獲得排他鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)取得相同數(shù)據(jù)集的讀寫。意向排他鎖事務(wù)打算給數(shù)據(jù)行加行排他鎖,事務(wù)在給一個數(shù)據(jù)行加排他鎖前必須先取得該表的鎖。 廢話 本篇的名字簡直可以起成《事務(wù)操作:從入門到放棄》。 力圖解決:在MySQL 5.5 版本及更高版本時,使用事務(wù)的完整流程和細節(jié)記錄,而無需面對...

    iOS122 評論0 收藏0
  • 數(shù)據(jù)庫并發(fā)控制協(xié)議

    摘要:關(guān)于串行化與一致性的關(guān)系數(shù)據(jù)庫并發(fā)控制的基本目標是確保事務(wù)的并發(fā)執(zhí)行不會導致數(shù)據(jù)庫一致性的丟失。該請求發(fā)送給并發(fā)控制管理器,只有并發(fā)控制管理器授予所需鎖后,事務(wù)才能繼續(xù)其操作。 全文主要參考數(shù)據(jù)庫系統(tǒng)概念一書以及mooc上戰(zhàn)德臣老師的數(shù)據(jù)庫課程  事務(wù)最基本的特性之一是隔離性,當數(shù)據(jù)庫中有多個事務(wù)并發(fā)執(zhí)行的時候,隔離性不一定能保持。為了保持事務(wù)的隔離性,系統(tǒng)必須對并發(fā)事務(wù)之間的相互作用...

    glumes 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<