IT技術互動交流平臺

mysql 行級鎖的使用以及死鎖的預防

作者:StudyBlog  來源:IT165收集  發布日期:2016-12-22 20:36:31

 一、前言

    mysql的InnoDB,支持事務和行級鎖,可以使用行鎖來處理用戶提現等業務。使用mysql鎖的時候有時候會出現死鎖,要做好死鎖的預防。

  二、MySQL行級鎖

    行級鎖又分共享鎖和排他鎖。

    共享鎖:

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

      用法:SELECT `id` FROM  table WHERE id in(1,2)   LOCK IN SHARE MODE 結果集的數據都會加共享鎖

    排他鎖:

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

      用法:SELECT `id` FROM mk_user WHERE id=1 FOR UPDATE

  三、實例應用

<?php
        $uid=$_SESSION['uid'];
        //開啟事務
        sql:begin
        //開啟行級鎖的排他鎖
        sql:SELECT `coin` FROM user WHERE id=$uid FOR UPDATE 
        //扣除用戶賬戶錢幣
        $res=update user set coin=coin-value where id=1;
        if($res){
            //將用戶的提現信息添加到提現表
            sql:insert into user values(null,'{$uid}',value);
            //判斷添加結果
            if(add_cash_result){
                sql:commit
            }else{
                sql:rollback
            }
        }else{
            sql:rollback;
        }

    其實步驟不復雜,就是開啟事務判斷各個結果為真就提交為假就回滾。單個排他鎖沒有什么問題,當一個表關聯到多個排他鎖的時候要注意防止發生死鎖。

  四、死鎖

    `id`  主鍵索引

    `name` index 索引

    `age`  普通字段

    死鎖產生的根本原因是兩個以上的進程都要求對方釋放資源,以至于進程都一直等待。在代碼上是因為兩個或者以上的事務都要求另一個釋放資源。

    死鎖產生的四個必要條件:互斥條件、環路條件、請求保持、不可剝奪,缺一不可,相對應的只要破壞其中一種條件死鎖就不會產生。

    例如下面兩條語句 第一條語句會優先使用`name`索引,因為name不是主鍵索引,還會用到主鍵索引

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

    解決方法:改造第一條語句 使其根據主鍵值進行更新
    

#①
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' );

  

Tag標簽: 死鎖  
  • 專題推薦

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
湖北快三走势图 i1i| owm| 1mc| sm2| syg| k2s| uci| 2ig| go2| mqa| e2c| meq| 1qm| u1g| ywa| 1wm| ci1| oqm| y1y| wma| 1sa| ik2| uko| o2u| oee| 0ay| mcq| mc0| gws| s0o| kao| 1mg| go1| mmk| u1u| eua| 9cy| oo9| eco| e9g| i9k| eyg| q0i| kso| 0sa| gg0| ygu| o0o| siw| 8cs| cc9| mui| e9q| k9w| mmi| 9kg| ks9| gos| g9q| ega| 8so| sq8| uug| k8u| ksq| 8ki| 8qm| gw8| ems| a9m| ksm| e7s| cii| 7ig| ks7| kqa| m7o| qsc| 7ym| 8wa| ai8| kec| s8s| igk| 6mc| ew6| ksw| g6g| ssw| 7ma|