搜尋
首頁後端開發php教程淺析php簡單操作mysql鎖機制
淺析php簡單操作mysql鎖機制Apr 30, 2021 pm 05:16 PM
mysql鎖機制php

淺析php簡單操作mysql鎖機制

鎖定機制
共享鎖定與排他鎖定
共享鎖定(讀鎖定):其他交易可以讀,但不能寫。
排他鎖(寫鎖) :其他事務不能讀取,也不能寫。

對於MySQL來說,有三種鎖定的層級:頁級、表格層級、行級

  • 頁級的典型代表引擎為BDB。
  • 行級的典型代表引擎為INNODB。
  • 表級的典型代表引擎為MyISAM,MEMORY以及很久以前的ISAM。
  • BDB 儲存引擎採用的是頁面鎖定(page-level locking),但也支援表格層級鎖定
  • InnoDB 儲存引擎既支援行級鎖定(row-level locking),也支援表級鎖,但預設為採用行級鎖。
  • MyISAM 和MEMORY 儲存引擎採用的是表格級鎖定

#相關免費學習推薦: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 /**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/4/29 0029
 * Time: 11:20
 */$link = new mysqli(&#39;127.0.0.1&#39;, &#39;root&#39;, &#39;123&#39;, &#39;db_school&#39;); // 连接数据库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 /**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/4/29 0029
 * Time: 10:06
 */$link = new mysqli(&#39;127.0.0.1&#39;, &#39;root&#39;, &#39;123&#39;, &#39;db_school&#39;); // 连接数据库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鎖機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。