濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Mysql 行級(jí)鎖的使用及死鎖的預(yù)防方案

Mysql 行級(jí)鎖的使用及死鎖的預(yù)防方案

熱門標(biāo)簽:沈陽(yáng)智能外呼系統(tǒng)供應(yīng)商 地圖簡(jiǎn)圖標(biāo)注 南通電銷外呼系統(tǒng)哪家強(qiáng) 桂林云電銷機(jī)器人收費(fèi) 如何選擇優(yōu)質(zhì)的外呼系統(tǒng) 東莞外呼企業(yè)管理系統(tǒng) 谷歌地圖標(biāo)注位置圖解 手機(jī)外呼系統(tǒng)違法嗎 清遠(yuǎn)申請(qǐng)400電話

一、前言

    mysql的InnoDB,支持事務(wù)和行級(jí)鎖,可以使用行鎖來(lái)處理用戶提現(xiàn)等業(yè)務(wù)。使用mysql鎖的時(shí)候有時(shí)候會(huì)出現(xiàn)死鎖,要做好死鎖的預(yù)防。

二、MySQL行級(jí)鎖

    行級(jí)鎖又分共享鎖和排他鎖。

    共享鎖:

      名詞解釋:共享鎖又叫做讀鎖,所有的事務(wù)只能對(duì)其進(jìn)行讀操作不能寫操作,加上共享鎖后其他事務(wù)不能再加排他鎖了只能加行級(jí)鎖。

      用法:

SELECT `id` FROM table WHERE id in(1,2)  LOCK IN SHARE MODE 

結(jié)果集的數(shù)據(jù)都會(huì)加共享鎖

    排他鎖:

      名詞解釋:若某個(gè)事物對(duì)某一行加上了排他鎖,只能這個(gè)事務(wù)對(duì)其進(jìn)行讀寫,其他事務(wù)不能對(duì)其進(jìn)行加任何鎖,其他進(jìn)程可以讀取,不能進(jìn)行寫操作,需等待其釋放。

      用法:

SELECT `id` FROM mk_user WHERE id=1 FOR UPDATE

三、實(shí)例應(yīng)用

?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;
  }

    其實(shí)步驟不復(fù)雜,就是開(kāi)啟事務(wù)判斷各個(gè)結(jié)果為真就提交為假就回滾。單個(gè)排他鎖沒(méi)有什么問(wèn)題,當(dāng)一個(gè)表關(guān)聯(lián)到多個(gè)排他鎖的時(shí)候要注意防止發(fā)生死鎖。

四、死鎖

    `id`  主鍵索引

    `name` index 索引

    `age`  普通字段

    死鎖產(chǎn)生的根本原因是兩個(gè)以上的進(jìn)程都要求對(duì)方釋放資源,以至于進(jìn)程都一直等待。在代碼上是因?yàn)閮蓚€(gè)或者以上的事務(wù)都要求另一個(gè)釋放資源。

    死鎖產(chǎn)生的四個(gè)必要條件:互斥條件、環(huán)路條件、請(qǐng)求保持、不可剝奪,缺一不可,相對(duì)應(yīng)的只要破壞其中一種條件死鎖就不會(huì)產(chǎn)生。

    例如下面兩條語(yǔ)句 第一條語(yǔ)句會(huì)優(yōu)先使用`name`索引,因?yàn)閚ame不是主鍵索引,還會(huì)用到主鍵索引

    第二條語(yǔ)句是首先使用主鍵索引,再使用name索引 如果兩條語(yǔ)句同時(shí)執(zhí)行,第一條語(yǔ)句執(zhí)行了name索引等待第二條釋放主鍵索引,第二條執(zhí)行了主鍵索引等待第一條的name索引,這樣就造成了死鎖。

    解決方法:改造第一條語(yǔ)句 使其根據(jù)主鍵值進(jìn)行更新

#①
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 行級(jí)鎖的使用及死鎖的預(yù)防解決方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

您可能感興趣的文章:
  • 詳解MySQL中的死鎖情況以及對(duì)死鎖的處理方法
  • 一次Mysql死鎖排查過(guò)程的全紀(jì)錄
  • mysql 數(shù)據(jù)庫(kù)死鎖原因及解決辦法
  • MySQL死鎖問(wèn)題分析及解決方法實(shí)例詳解
  • 查找MySQL線程中死鎖的ID的方法
  • Mysql 數(shù)據(jù)庫(kù)死鎖過(guò)程分析(select for update)
  • 詳解MySQL(InnoDB)是如何處理死鎖的
  • MySQL數(shù)據(jù)庫(kù)的一次死鎖實(shí)例分析
  • 通過(guò)唯一索引S鎖與X鎖來(lái)了解MySQL死鎖套路
  • Mysql查看死鎖與解除死鎖的深入講解

標(biāo)簽:貴州 重慶 天津 內(nèi)蒙古 湖州 成都 常德 臨沂

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Mysql 行級(jí)鎖的使用及死鎖的預(yù)防方案》,本文關(guān)鍵詞  Mysql,行級(jí),鎖,的,使用,及,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Mysql 行級(jí)鎖的使用及死鎖的預(yù)防方案》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Mysql 行級(jí)鎖的使用及死鎖的預(yù)防方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    靖宇县| 宁波市| 班戈县| 诏安县| 泰兴市| 保定市| 咸丰县| 葫芦岛市| 丰县| 县级市| 铁力市| 梓潼县| 绥化市| 许昌县| 元朗区| 化德县| 蒙城县| 渝北区| 临沧市| 丰原市| 镇沅| 台中市| 崇文区| 出国| 垫江县| 纳雍县| 进贤县| 三明市| 岢岚县| 临潭县| 麻江县| 宁阳县| 新巴尔虎左旗| 鄂州市| 台前县| 临猗县| 怀远县| 溧阳市| 齐河县| 新干县| 宁德市|