91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在php中操作mysql鎖機制

發布時間:2021-05-06 15:47:11 來源:億速云 閱讀:372 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關怎么在php中操作mysql鎖機制,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

php的框架有哪些

php的框架:1、Laravel,Laravel是一款免費并且開源的PHP應用框架。2、Phalcon,Phalcon是運行速度最快的一個PHP框架。3、Symfony,Symfony是一款為Web項目準備的PHP框架。4、Yii,Yii是一款快速、安全和專業的PHP框架。5、CodeIgniter,CodeIgniter是一款非常敏捷的開源PHP框架。6、CakePHP,CakePHP是一款老牌的PHP框架。7.Kohana,Kohana是一款敏捷但是功能強大的PHP框架。


1、MyISAM 表鎖

MyISAM表級鎖模式:

  • 表共享讀鎖 (Table Read Lock):不會阻塞其他用戶對同一表的讀請求,但會阻塞對同一表的寫請求;

  • 表獨占寫鎖 (Table Write Lock):會阻塞其他用戶對同一表的讀和寫操作;

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加為只讀鎖
    當前進程查詢:select * from hero;會報Table ‘hero’ was not locked with LOCK TABLES。
    當前進程更改其他表:update hero set name=“ss” where number=1; 會報Table ‘hero’ was not locked with LOCK TABLES
    當前進程更改表:update account set name=“ssss” where id=1;會報Table ‘account’ was locked with a READ lock and can’t be updated
    如果別mysql進程進來,可以查詢其他表和account,但不能更改account,會一直等待,需要釋放鎖才執行

1.1PHP操作

<?php/**
 */$link = new mysqli('127.0.0.1', 'root', '123', 'db_school'); // 連接數據庫if(mysqli_connect_errno()){                                // 檢查連接錯誤
    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);  //測試    //假設還沒釋放鎖,開啟cmd進mysql(s2)可以查詢,但不能執行更改和刪除操作,會等待這邊釋放鎖$link->query("unlock tables");    //取消全部的鎖//解鎖后正常操作//$result = $link -> query($sql1);//var_dump($result);$link->close();

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

  • Table_locks_immediate 指的是能夠立即獲得表級鎖的次數

  • Table_locks_waited 指的是不能立即獲取表級鎖而需要等待的次數

2.InnoDB加鎖方法:

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

  • 共享鎖(S):SELECT * FROM table_name WHERE … LOCK IN SHARE MODE。其他 session 仍然可以查詢記錄,并也可以對該記錄加 share mode 的共享鎖。但是如果當前事務需要對該記錄進行更新操作,則很有可能造成死鎖。大家都能讀,但是不能改,只有其中一個獨占共享鎖時候才能改;

  • 排他鎖(X):SELECT * FROM table_name WHERE … FOR UPDATE。其他 session 可以查詢該記錄,但是不能對該記錄加共享鎖或排他鎖,而是等待獲得鎖。我要改,你們都不能改,也不能讀
    #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:發現有鎖等待后會立即返回錯誤,不用等待鎖超時后報錯。
    –SKIP LOCKED:跳過被鎖定的行,直接更新其他行,但是這樣要注意是否會造成更新結果不符合預期。

2.1PHP操作

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

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

看完上述內容,你們對怎么在php中操作mysql鎖機制有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五莲县| 鄱阳县| 日土县| 望奎县| 正宁县| 开远市| 浪卡子县| 黑河市| 辽宁省| 朝阳市| 章丘市| 九龙坡区| 文昌市| 周宁县| 永城市| 民和| 微山县| 新巴尔虎左旗| 昔阳县| 囊谦县| 滁州市| 平武县| 吉木萨尔县| 长宁县| 弥渡县| 兴安盟| 舞阳县| 南华县| 扎囊县| 甘肃省| 桑植县| 乐东| 永靖县| 融水| 岑巩县| 巢湖市| 台北市| 铁岭县| 都兰县| 洛隆县| 孟津县|