鎖定機制
共享鎖定與排他鎖定
共享鎖定(讀鎖定):其他交易可以讀,但不能寫。
排他鎖(寫鎖) :其他事務不能讀取,也不能寫。
對於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)這兩張表
- 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('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 /** * Created by PhpStorm. * User: Administrator * Date: 2021/4/29 0029 * Time: 10:06 */$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鎖機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver Mac版
視覺化網頁開發工具

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

SublimeText3漢化版
中文版,非常好用

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