搜尋
首頁後端開發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應用程序更快May 12, 2025 am 12:12 AM

tomakephpapplicationsfaster,關注台詞:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

PHP性能優化清單:立即提高速度PHP性能優化清單:立即提高速度May 12, 2025 am 12:07 AM

到ImprovephPapplicationspeed,關注台詞:1)啟用opcodeCachingwithapCutoredUcescriptexecutiontime.2)實現databasequerycachingingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandreduceconnection.4 limitesclection.4.4

PHP依賴注入:提高代碼可檢驗性PHP依賴注入:提高代碼可檢驗性May 12, 2025 am 12:03 AM

依赖注入(DI)通过显式传递依赖关系,显著提升了PHP代码的可测试性。1)DI解耦类与具体实现,使测试和维护更灵活。2)三种类型中,构造函数注入明确表达依赖,保持状态一致。3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

PHP性能優化:數據庫查詢優化PHP性能優化:數據庫查詢優化May 12, 2025 am 12:02 AM

DatabasequeryoptimizationinPHPinvolvesseveralstrategiestoenhanceperformance.1)Selectonlynecessarycolumnstoreducedatatransfer.2)Useindexingtospeedupdataretrieval.3)Implementquerycachingtostoreresultsoffrequentqueries.4)Utilizepreparedstatementsforeffi

簡單指南:帶有PHP腳本的電子郵件發送簡單指南:帶有PHP腳本的電子郵件發送May 12, 2025 am 12:02 AM

phpisusedforsenderemailsduetoitsbuilt-inmail()函數andsupportivelibrariesLikePhpMailerAndSwiftMailer.1)usethemail()functionForbasiceMails,butithasimails.2)butithasimail.2)

PHP性能:識別和修復瓶頸PHP性能:識別和修復瓶頸May 11, 2025 am 12:13 AM

PHP性能瓶颈可以通过以下步骤解决:1)使用Xdebug或Blackfire进行性能分析,找出问题所在;2)优化数据库查询并使用缓存,如APCu;3)使用array_filter等高效函数优化数组操作;4)配置OPcache进行字节码缓存;5)优化前端,如减少HTTP请求和优化图片;6)持续监控和优化性能。通过这些方法,可以显著提升PHP应用的性能。

PHP的依賴注入:快速摘要PHP的依賴注入:快速摘要May 11, 2025 am 12:09 AM

依賴性注射(DI)InphpisadesignPatternthatManages和ReducesClassDeptions,增強量強制性,可驗證性和MATIALWINABIOS.ItallowSpasspassingDepentenciesLikEdenciesLikedAbaseConnectionStoclasseconnectionStoclasseSasasasasareTers,interitationAseTestingEaseTestingEaseTestingEaseTestingEasingAndScalability。

提高PHP性能:緩存策略和技術提高PHP性能:緩存策略和技術May 11, 2025 am 12:08 AM

cachingimprovesphpermenceByStorcyResultSofComputationsorqucrouctationsorquctationsorquickretrieval,reducingServerLoadAndenHancingResponsetimes.feftectivestrategiesinclude:1)opcodecaching,whereStoresCompiledSinmememorytssinmemorytoskipcompliation; 2)datacaching datacachingsingMemccachingmcachingmcachings

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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

MantisBT

MantisBT

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!