最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年12月21日 10:04:04   作者:StudyBlog  
mysql的InnoDB,支持事務(wù)和行級(jí)鎖,可以使用行鎖來(lái)處理用戶提現(xiàn)等業(yè)務(wù)。使用mysql鎖的時(shí)候有時(shí)候會(huì)出現(xiàn)死鎖,要做好死鎖的預(yù)防。這篇文章通過(guò)實(shí)例應(yīng)用給大家講解

一、前言

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

二、MySQL行級(jí)鎖

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

    共享鎖:

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

      用法:

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

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

    排他鎖:

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

      用法:

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 
  //扣除用戶賬戶錢(qián)幣
  $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)站的支持!

相關(guān)文章

  • 深入分析MySQL 的備份和恢復(fù)機(jī)制

    深入分析MySQL 的備份和恢復(fù)機(jī)制

    備份對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō)是相當(dāng)重要的工作。如果數(shù)據(jù)庫(kù)在使用過(guò)程中出現(xiàn)了問(wèn)題,比如系統(tǒng)崩潰、硬件故障或錯(cuò)誤的刪除了數(shù)據(jù)。這時(shí),如果我們進(jìn)行了數(shù)據(jù)備份,就能比較方便的使數(shù)據(jù)庫(kù)恢復(fù)工作,并使我們的數(shù)據(jù)損失到最小。下面我們來(lái)詳細(xì)探討下數(shù)據(jù)庫(kù)的備份與恢復(fù)。
    2016-11-11
  • MySQL中字段名和保留字沖突的解決辦法

    MySQL中字段名和保留字沖突的解決辦法

    這篇文章主要介紹了MySQL中字段名和保留字沖突的解決辦法,其實(shí)只需要用撇號(hào)把字段名括起來(lái)就可以了,這樣在select、insert、update、delete語(yǔ)句中都不會(huì)有問(wèn)題,需要的朋友可以參考下
    2014-06-06
  • MySQL中(JOIN/ORDER BY)語(yǔ)句的查詢過(guò)程及優(yōu)化方法

    MySQL中(JOIN/ORDER BY)語(yǔ)句的查詢過(guò)程及優(yōu)化方法

    sql語(yǔ)句性能達(dá)不到你的要求,執(zhí)行效率讓你忍無(wú)可忍,一般會(huì)造成很多影響。那么我們?nèi)绾谓鉀Q這些問(wèn)題呢,下面由小編來(lái)和大家簡(jiǎn)單講下
    2019-05-05
  • mysql慢查詢?nèi)罩据嗈D(zhuǎn)_MySQL慢查詢?nèi)罩緦?shí)操

    mysql慢查詢?nèi)罩据嗈D(zhuǎn)_MySQL慢查詢?nèi)罩緦?shí)操

    這篇文章主要介紹了mysql慢查詢?nèi)罩据嗈D(zhuǎn)_MySQL慢查詢?nèi)罩緦?shí)操,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • MySQL性能調(diào)優(yōu)之索引與參數(shù)調(diào)優(yōu)實(shí)踐指南

    MySQL性能調(diào)優(yōu)之索引與參數(shù)調(diào)優(yōu)實(shí)踐指南

    在高并發(fā),海量數(shù)據(jù)場(chǎng)景下,MySQL數(shù)據(jù)庫(kù)性能直接影響業(yè)務(wù)體驗(yàn)和系統(tǒng)穩(wěn)定性,本文主要來(lái)和大家講講MySQL索引與查詢參數(shù)調(diào)優(yōu)技巧,希望對(duì)大家有所幫助
    2025-07-07
  • MySQL中使用SQL語(yǔ)句對(duì)字段進(jìn)行重命名

    MySQL中使用SQL語(yǔ)句對(duì)字段進(jìn)行重命名

    MySQL中,如何使用SQL語(yǔ)句來(lái)對(duì)表中某一個(gè)字段進(jìn)行重命名呢?我們將使用alter table 這一SQL語(yǔ)句,需要的朋友可以參考下
    2016-04-04
  • MySQL中的鎖類(lèi)型都有哪些

    MySQL中的鎖類(lèi)型都有哪些

    這篇文章主要介紹了MySQL中的鎖類(lèi)型都有哪些,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Mysql實(shí)現(xiàn)增量恢復(fù)的方法詳解

    Mysql實(shí)現(xiàn)增量恢復(fù)的方法詳解

    本文給大家分享的是如何實(shí)現(xiàn)mysql增量恢復(fù)的場(chǎng)景以及具體實(shí)現(xiàn)方法,有需要的小伙伴可以參考下
    2018-07-07
  • Mysql大型SQL文件快速恢復(fù)方案分享

    Mysql大型SQL文件快速恢復(fù)方案分享

    這篇文章主要給大家介紹了關(guān)于Mysql大型SQL文件快速恢復(fù)方案的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 解決mysql報(bào)錯(cuò)ERROR 1049 (42000): Unknown database ‘?dāng)?shù)據(jù)庫(kù)‘的問(wèn)題

    解決mysql報(bào)錯(cuò)ERROR 1049 (42000): Unknown dat

    對(duì)于錯(cuò)誤代碼1049(42000):Unknown database ‘?dāng)?shù)據(jù)庫(kù)‘,這個(gè)錯(cuò)誤通常表示您正在嘗試訪問(wèn)一個(gè)不存在的數(shù)據(jù)庫(kù),本文給出了解決方法,您可以按照文中步驟進(jìn)行操作,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

蒙阴县| 灯塔市| 禄丰县| 庆城县| 屏南县| 广昌县| 龙里县| 杭锦后旗| 凤冈县| 额济纳旗| 连山| 平度市| 苍溪县| 韶山市| 兴山县| 芜湖县| 张掖市| 五寨县| 裕民县| 尉犁县| 嘉义县| 团风县| 东城区| 瑞丽市| 光泽县| 永宁县| 资兴市| 云霄县| 贵德县| 威远县| 呼图壁县| 上杭县| 楚雄市| 东乡县| 晴隆县| 兰溪市| 绵阳市| 河西区| 贵溪市| 嘉鱼县| 临高县|