MYSQL中的鎖:
為銅官等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及銅官網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站建設(shè)、網(wǎng)站制作、銅官網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
語(yǔ)法 :
LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE .................. 【鎖表】
UNLOCK TABLES 【釋放表】
Read:讀鎖|共享鎖 : 所有的客戶端只能讀這個(gè)表不能寫(xiě)這個(gè)表
Write:寫(xiě)鎖|排它鎖: 所有當(dāng)前鎖定客戶端可以操作這個(gè)表,其他客戶端只能阻塞
注意:在鎖表的過(guò)程中只能操作被鎖定的表,如果要操作其他表,必須把所有要操作的表都鎖定起來(lái)!
PHP中的文件鎖 (鎖的是文件,不是表)
文件鎖的文件與表有什么關(guān)系?:一點(diǎn)關(guān)系也沒(méi)有,與令牌相似,誰(shuí)拿到誰(shuí)操作。所以表根本沒(méi)鎖。
測(cè)試時(shí),有個(gè)文件就行,叫什么名無(wú)所謂
?php
//連接數(shù)據(jù)庫(kù)
$con=mysqli_connect("192.168.2.186","root","root","test");
//查詢商品數(shù)量是否大于0,大于0才能下單,并減少庫(kù)存
$fp = fopen("lock.txt", "r");
//加鎖
if(flock($fp,LOCK_EX))
{
$res=mysqli_fetch_assoc(mysqli_query($con,'SELECT total FROM shop WHERE id=1 LIMIT 1'));
if($res['total']0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');}
//執(zhí)行完成解鎖
flock($fp,LOCK_UN);
}
//關(guān)閉文件
fclose($fp);
unset($res);
mysqli_close($con);
?
手動(dòng)加鎖:
表級(jí)鎖
lock tables tablename read;//共享鎖
lock tables tablename write;//排它鎖
unlock tables;//解鎖
php直接query就行了。
除了MyIsam,誰(shuí)還會(huì)無(wú)聊到顯式加鎖?
InnoDB直接跑事務(wù)默認(rèn)會(huì)觸發(fā)隱式鎖,不需要自己lock和unlock。