站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

淺析php簡單操作mysql鎖機(jī)制

淺析php簡單操作mysql鎖機(jī)制

鎖機(jī)制
共享鎖與排他鎖
共享鎖(讀鎖):其他事務(wù)可以讀,但不能寫。
排他鎖(寫鎖) :其他事務(wù)不能讀取,也不能寫。

對(duì)于MySQL來說,有三種鎖的級(jí)別:頁級(jí)、表級(jí)、行級(jí)

  • 頁級(jí)的典型代表引擎為BDB。
  • 行級(jí)的典型代表引擎為INNODB。
  • 表級(jí)的典型代表引擎為MyISAM,MEMORY以及很久以前的ISAM。
  • BDB 存儲(chǔ)引擎采用的是頁面鎖(page-level locking),但也支持表級(jí)鎖
  • InnoDB 存儲(chǔ)引擎既支持行級(jí)鎖(row-level locking),也支持表級(jí)鎖,但默認(rèn)情況下是采用行級(jí)鎖。
  • MyISAM 和 MEMORY 存儲(chǔ)引擎采用的是表級(jí)鎖

相關(guān)免費(fèi)學(xué)習(xí)推薦:php編程(視頻)

1、MyISAM 表鎖

MyISAM表級(jí)鎖模式:

  • 表共享讀鎖 (Table Read Lock):不會(huì)阻塞其他用戶對(duì)同一表的讀請(qǐng)求,但會(huì)阻塞對(duì)同一表的寫請(qǐng)求;
  • 表獨(dú)占寫鎖 (Table Write Lock):會(huì)阻塞其他用戶對(duì)同一表的讀和寫操作;

MyISAM加表鎖方法:

  • 用 LOCK TABLE 命令給 MyISAM 表顯式加鎖
  • LOCK TABLES real_table (READ|WRITE), insert_table (READ|WRITE); //加鎖
  • UNLOCK TABLES; //解鎖

列子:
比如有 account(id,name,cash),hero(number,name,country)這兩張表

  1. lock tables account read; 將account加為只讀鎖
    當(dāng)前進(jìn)程查詢:select * from hero;會(huì)報(bào)Table ‘hero’ was not locked with LOCK TABLES。
    當(dāng)前進(jìn)程更改其他表:update hero set name=“ss” where number=1; 會(huì)報(bào)Table ‘hero’ was not locked with LOCK TABLES
    當(dāng)前進(jìn)程更改表:update account set name=“ssss” where id=1;會(huì)報(bào)Table ‘a(chǎn)ccount’ was locked with a READ lock and can’t be updated
    如果別mysql進(jìn)程進(jìn)來,可以查詢其他表和account,但不能更改account,會(huì)一直等待,需要釋放鎖才執(zhí)行

1.1PHP操作

<?php/**  * Created by PhpStorm.  * User: Administrator  * Date: 2021/4/29 0029  * Time: 11:20  */$link = new mysqli('127.0.0.1', 'root', '123', 'db_school'); // 連接數(shù)據(jù)庫if(mysqli_connect_errno()){                                // 檢查連接錯(cuò)誤     printf("連接失?。?s<br>", mysqli_connect_error());     exit();}//(s1)$table = "account";$type = "read";$sql1 = "LOCK TABLES $table $type";$link->query($sql1);//處理邏輯//$sql1 = "select * from $table;";        //(s1)true//$sql1 = "select * from hero;";        //false//$sql1 = "update hero set name='ss' where number=1; ";     //false$sql1 = "update account set name='ssss' where id=1;";   //false$result = $link->query($sql1);var_dump($result);sleep(20);  //測試    //假設(shè)還沒釋放鎖,開啟cmd進(jìn)mysql(s2)可以查詢,但不能執(zhí)行更改和刪除操作,會(huì)等待這邊釋放鎖$link->query("unlock tables");    //取消全部的鎖//解鎖后正常操作//$result = $link -> query($sql1);//var_dump($result);$link->close();

查詢表級(jí)鎖爭用情況
show status like ‘Table%’;

  • Table_locks_immediate 指的是能夠立即獲得表級(jí)鎖的次數(shù)
  • Table_locks_waited 指的是不能立即獲取表級(jí)鎖而需要等待的次數(shù)

2.InnoDB加鎖方法:

對(duì)于普通 SELECT 語句,InnoDB 不會(huì)加任何鎖;只能在事務(wù)執(zhí)行過程中使用加鎖
鎖只有在執(zhí)行commit或者rollback的時(shí)候才會(huì)釋放,并且所有的鎖都是在同一時(shí)刻被釋放。

  • 共享鎖(S):SELECT * FROM table_name WHERE … LOCK IN SHARE MODE。其他 session 仍然可以查詢記錄,并也可以對(duì)該記錄加 share mode 的共享鎖。但是如果當(dāng)前事務(wù)需要對(duì)該記錄進(jìn)行更新操作,則很有可能造成死鎖。大家都能讀,但是不能改,只有其中一個(gè)獨(dú)占共享鎖時(shí)候才能改;
  • 排他鎖(X):SELECT * FROM table_name WHERE … FOR UPDATE。其他 session 可以查詢該記錄,但是不能對(duì)該記錄加共享鎖或排他鎖,而是等待獲得鎖。我要改,你們都不能改,也不能讀
    #select … lock in share mode //共享鎖
    #select … for update //排他鎖
    ##在 MySQL 8.0 中
  • 共享鎖(S):SELECT * FROM table_name WHERE … FOR SHARE
  • 排他鎖(X):SELECT * FROM table_name WHERE … FOR UPDATE[NOWAIT|SKIP LOCKED]
    –NOWAIT:發(fā)現(xiàn)有鎖等待后會(huì)立即返回錯(cuò)誤,不用等待鎖超時(shí)后報(bào)錯(cuò)。
    –SKIP LOCKED:跳過被鎖定的行,直接更新其他行,但是這樣要注意是否會(huì)造成更新結(jié)果不符合預(yù)期。

2.1PHP操作

<?php/**  * Created by PhpStorm.  * User: Administrator  * Date: 2021/4/29 0029  * Time: 10:06  */$link = new mysqli('127.0.0.1', 'root', '123', 'db_school'); // 連接數(shù)據(jù)庫if(mysqli_connect_errno()){                                // 檢查連接錯(cuò)誤     printf("連接失?。?s<br>", mysqli_connect_error());     exit();}//案例1$id = 1; //明確指定主鍵,并且有此數(shù)據(jù),row lock (行鎖)//$id = -1;   //明確指定主鍵,若查無此數(shù)據(jù),無lock (無鎖)$link->autocommit(0);                   // 開始事務(wù)(s1)//FOR UPDATE僅適用于InnoDB,且必須在交易區(qū)塊(BEGIN/COMMIT)中才能生效。$sql = "select * from account where id=$id for update";$link->query($sql);/***  * 此時(shí)其他mysql進(jìn)程可以查詢該記錄,但是不能對(duì)該記錄加共享鎖或排他鎖,而是等待獲得鎖。  *///(s1)可以進(jìn)行更改,和查詢等操作//$sql1 = "update account set name='aaa' where id=$id;";  //進(jìn)行更改//$sql1 = "select * from account where id=$id;";  //進(jìn)行查詢$sql1 = "delete from account where id=$id;";  //進(jìn)行刪除$result = $link -> query($sql1);var_dump($result);sleep(20); //測試    //假設(shè)還在事務(wù)處理中,開啟cmd進(jìn)mysql(s2)執(zhí)行更改和刪除操作,會(huì)等待這邊釋放鎖$link->commit();$link->close();

查看正在被鎖定的的表
show OPEN TABLES where In_use > 0;
SHOW PROCESSLIST顯示哪些線程正在運(yùn)行。

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
国产精品香蕉在线观看| 日韩小视频在线观看| 久久久久久国产精品免费无码| 精品国产黑色丝袜高跟鞋| 亚洲AV成人精品日韩一区| 国产精品无码专区在线播放| 亚洲区日韩精品中文字幕| 2022国产成人福利精品视频| 99re视频精品全部免费| 久久精品乱子伦免费| 欧洲精品视频在线观看| 国精品无码一区二区三区左线 | 亚洲一区爱区精品无码| 精品人妻少妇嫩草AV无码专区| 日本一区二区三区精品国产| 日韩亚洲AV无码一区二区不卡| 日韩精品一区二区三区视频 | 国产午夜精品一区二区| 国产精品无打码在线播放| WWW国产精品内射老师| 无码精品蜜桃一区二区三区WW| 日韩人妻高清精品专区| 日韩在线不卡视频| 日韩午夜伦y4480私人影院| 在线视频日韩精品| 日韩精品一区二区三区不卡| 思思久久99热免费精品6| 九九久久国产精品免费热6| 69堂国产成人精品视频不卡| 国产成人综合精品一区| 国产高清在线精品一区二区三区 | 久久国产精品最新一区| 亚洲AV无码精品色午夜在线观看| 日韩精品成人一区二区三区| 久久精品乱子伦免费| 99re6这里只有精品视频| 91精品国产亚洲爽啪在线影院| 亚洲视频国产精品| 国产精品bbwbbwbbw| 免费看国产精品3a黄的视频| 精品国产一区在线观看|