《MYSQL數(shù)據(jù)庫(kù)Mysql 行級(jí)鎖的使用及死鎖的預(yù)防方案》要點(diǎn):
本文介紹了MYSQL數(shù)據(jù)庫(kù)Mysql 行級(jí)鎖的使用及死鎖的預(yù)防方案,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
MYSQL學(xué)習(xí)一、前言
MYSQL學(xué)習(xí) mysql的InnoDB,支持事務(wù)和行級(jí)鎖,可以使用行鎖來(lái)處理用戶提現(xiàn)等業(yè)務(wù).使用mysql鎖的時(shí)候有時(shí)候會(huì)出現(xiàn)死鎖,要做好死鎖的預(yù)防.
MYSQL學(xué)習(xí)二、MySQL行級(jí)鎖
MYSQL學(xué)習(xí) 行級(jí)鎖又分共享鎖和排他鎖.
MYSQL學(xué)習(xí) 共享鎖:
MYSQL學(xué)習(xí) 名詞解釋:共享鎖又叫做讀鎖,所有的事務(wù)只能對(duì)其進(jìn)行讀操作不能寫操作,加上共享鎖后其他事務(wù)不能再加排他鎖了只能加行級(jí)鎖.
MYSQL學(xué)習(xí) 用法:
MYSQL學(xué)習(xí)
SELECT `id` FROM table WHERE id in(1,2) LOCK IN SHARE MODE
MYSQL學(xué)習(xí)結(jié)果集的數(shù)據(jù)都會(huì)加共享鎖
MYSQL學(xué)習(xí) 排他鎖:
MYSQL學(xué)習(xí) 名詞解釋:若某個(gè)事物對(duì)某一行加上了排他鎖,只能這個(gè)事務(wù)對(duì)其進(jìn)行讀寫,其他事務(wù)不能對(duì)其進(jìn)行加任何鎖,其他進(jìn)程可以讀取,不能進(jìn)行寫操作,需等待其釋放.
MYSQL學(xué)習(xí) 用法:
MYSQL學(xué)習(xí)
SELECT `id` FROM mk_user WHERE id=1 FOR UPDATE
MYSQL學(xué)習(xí)三、實(shí)例應(yīng)用
MYSQL學(xué)習(xí)
<?php
$uid=$_SESSION['uid'];
//開(kāi)啟事務(wù)
sql:begin
//開(kāi)啟行級(jí)鎖的排他鎖
sql:SELECT `coin` FROM user WHERE id=$uid FOR UPDATE
//扣除用戶賬戶錢幣
$res=update user set coin=coin-value where id=1;
if($res){
//將用戶的提現(xiàn)信息添加到提現(xiàn)表
sql:insert into user values(null,"{$uid}",value);
//判斷添加結(jié)果
if(add_cash_result){
sql:commit
}else{
sql:rollback
}
}else{
sql:rollback;
}
MYSQL學(xué)習(xí) 其實(shí)步驟不復(fù)雜,就是開(kāi)啟事務(wù)判斷各個(gè)結(jié)果為真就提交為假就回滾.單個(gè)排他鎖沒(méi)有什么問(wèn)題,當(dāng)一個(gè)表關(guān)聯(lián)到多個(gè)排他鎖的時(shí)候要注意防止發(fā)生死鎖.
MYSQL學(xué)習(xí)四、死鎖
MYSQL學(xué)習(xí) `id`? 主鍵索引
MYSQL學(xué)習(xí) `name` index 索引
MYSQL學(xué)習(xí) `age`? 普通字段
MYSQL學(xué)習(xí) 死鎖產(chǎn)生的根本原因是兩個(gè)以上的進(jìn)程都要求對(duì)方釋放資源,以至于進(jìn)程都一直等待.在代碼上是因?yàn)閮蓚€(gè)或者以上的事務(wù)都要求另一個(gè)釋放資源.
MYSQL學(xué)習(xí) 死鎖產(chǎn)生的四個(gè)必要條件:互斥條件、環(huán)路條件、哀求保持、不可剝奪,缺一不可,相對(duì)應(yīng)的只要破壞其中一種條件死鎖就不會(huì)產(chǎn)生.
MYSQL學(xué)習(xí) 例如下面兩條語(yǔ)句 第一條語(yǔ)句會(huì)優(yōu)先使用`name`索引,因?yàn)閚ame不是主鍵索引,還會(huì)用到主鍵索引
MYSQL學(xué)習(xí) 第二條語(yǔ)句是首先使用主鍵索引,再使用name索引 如果兩條語(yǔ)句同時(shí)執(zhí)行,第一條語(yǔ)句執(zhí)行了name索引等待第二條釋放主鍵索引,第二條執(zhí)行了主鍵索引等待第一條的name索引,這樣就造成了死鎖.
MYSQL學(xué)習(xí) 解決辦法:改造第一條語(yǔ)句 使其根據(jù)主鍵值進(jìn)行更新
MYSQL學(xué)習(xí)
#①
update mk_user set name ='1' where `name`='idis12';
#②
update mk_user set name='12' where id=12;
//改造后
update mk_user set name='1' where id=(select id from mk_user where name='idis12' );
MYSQL學(xué)習(xí)以上所述是小編給大家介紹的Mysql 行級(jí)鎖的使用及死鎖的預(yù)防解決辦法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的.在此也非常感謝大家對(duì)維易PHP網(wǎng)站的支持!
《MYSQL數(shù)據(jù)庫(kù)Mysql 行級(jí)鎖的使用及死鎖的預(yù)防方案》是否對(duì)您有啟發(fā),歡迎查看更多與《MYSQL數(shù)據(jù)庫(kù)Mysql 行級(jí)鎖的使用及死鎖的預(yù)防方案》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/11253.html