mysql的並發控制原理
Mysql是主流的開源關聯式資料庫,提供高效能的資料儲存服務。在做後端開發時,
有時會遇到效能瓶頸,這些瓶頸有時不是來自應用程式本身,而是來自資料庫層面。
所以所以掌握Mysql的一些底層原理有助於我們更能理解Mysql,對Mysql進行效能調優,
從而開發高效能的後端服務。
1、mysql的邏輯框架
mysql邏輯框架圖如下:
#最上層是處理客戶端過來的連接的。
主要做連線處理、授權認證、安全性等。 Mysql在這一層維護了一個執行緒池,用於處理來自客戶端的連線。 Mysql可以使用使用者名稱密碼認證,
也可以使用SSL基於X.509憑證認證。
第二層由三個部分組成:查詢快取、解析器、最佳化器。解析器用來解析SQL語句,最佳化器會對解析之後的語句進行最佳化。
在解析查詢前,伺服器會先檢查查詢緩存,如果能在其中找到對應的查詢結果,則無需再進行查詢解析、最佳化等過程,直接傳回查詢結果。預存程序、觸發器、視圖等都在這一層實現。
第三層是儲存引擎,儲存引擎負責在MySQL中儲存資料、擷取資料、開啟一個交易等等。儲存引擎透過API與上層進行通信,這些API屏蔽了不同儲存引擎之間的差異,使得這些差異對上層查詢流程透明化。儲存引擎不會去解析SQL。 mysql最常用的儲存引擎是InnoDB。
2、mysql的並發控制
如果多個執行緒同時操作數據,就有可能引發並發控制的問題。
2-1、讀寫鎖定
如果多個線程都只是讀數據,其實可以一起讀,不會互相影響,這個時候應該使用「讀鎖”,也稱為共享鎖。
取得讀鎖的執行緒之間互相不會阻塞,可以同時讀取一個資源。
如果有一個執行緒需要寫數據,則應該使用“寫鎖”,也成為排它鎖。
寫入鎖定會阻塞其它的寫鎖和讀鎖,直到寫入作業完成。
2-2、鎖定粒度
首先明確一個概念:在給定的資源上,需要加鎖的資料越少,系統能夠承載的同時數量就越高。
但加鎖也是需要消耗資源的,如果系統花費大量的時間來管理鎖,而不是存取數據,
那麼系統的效能可能會因此受影響。
所以一個好的「鎖定策略」就是要在鎖的開銷和資料的安全性之間尋求平衡,Mysql支援多個儲存引擎的架構,
每個儲存引擎都可以實現自己的鎖策略和鎖粒度。
2-3、表鎖定與行鎖
表鎖顧名思義就是鎖住整張表。表鎖定開銷比較小。對錶加寫鎖後,其它使用者對這張表的所有讀寫操作都會被阻塞。
在Mysql中,儘管儲存引擎可以提供自己的鎖,但Mysql有時候也會使用表鎖,像是ALTER TABLE之類的語句。
寫入鎖定比讀取鎖定有更高的優先權,因此一個寫鎖定請求可能會插入到讀鎖佇列的前面。
行級鎖定即鎖住整行,可以最大程度地支援並發處理,但加解鎖的開銷也會比較大。行級鎖定只在儲存引擎層實現,
所有的儲存引擎都以自己的方式實現了行級鎖定。
3、MVCC
MVCC即“多版本並發控制”,可以認為MVCC是行級鎖定的變種,但是它在很多情況下避免了加鎖定操作,
因此開銷更低。
主流的關聯式資料庫都實作了MVCC,但實作機制各有不同。實際上MVCC也沒有一個統一的標準。
但大都實現了非阻塞的讀取操作,寫入操作也只是鎖定必要的行。
MVCC保證的是每個事務裡面在執行期間看到的資料都是一致的。
但不同的交易由於開始的時間不同,所以可能對同一張表,同一時刻看到的資料是不一樣的。
在Mysql的InnoDB引擎,是透過給每行記錄後面保存兩個隱藏的列來實現的。
一個是保存行的建立時間,另一個保存了行的過期時間(或刪除時間)。
實際上儲存的並不是實際的一個時間戳,而是‘系統版本號’。
每次開啟一個事務,系統版本號碼都會遞增。事務開始時,系統版本號會作為事務的版本號,用來和查詢到的行的版本號進行比較。
下面分別介紹常見的CRUD作業中版本號碼是怎麼運作的:
INSERT
儲存目前系統版本好的作為行版本號
DELETE
將目前的系統版本號碼儲存到這行資料的「刪除版本」。
UPDATE
插入一行新紀錄,保存目前系統版本號作為航版本號,同時保存目前系統版本號到原來的行的「刪除版本」。
SELECT
只尋找版本早於目前交易版本的行。這樣可以保證事務讀取的行,要嘛之前就存在,
要嘛是這個事務本身自己插入或修改的。
行的「刪除版本」要麼未定義,要麼大於目前交易版本號。這樣可以確保事務讀取到的行,
在事務之前沒有被刪除。
MVCC只在REPEATABLE READ
和READ COMMITTED
兩個隔離等級下工作,其它兩個隔離等級不能運作。
因為READ UNCOMMITTED
總是會讀取最新的資料防,而不是符合目前交易版本的資料行。而SERIALIZABLE
則會對所有讀取的行都加鎖。
以上是為大家整理的一些關於並發控制的問題,更多相關問題請訪問PHP中文網相關教學。
推薦影片教學:https://www.php.cn/course/list/51/type/2.html
#以上是mysql的並發控制原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

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

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java集合框架透過執行緒安全集和並發控制機制來管理並發性。線程安全集合(如CopyOnWriteArrayList)保證資料一致性,而非線程安全集合(如ArrayList)需要外部同步。 Java提供了鎖定、原子操作、ConcurrentHashMap和CopyOnWriteArrayList等機制來控制並發,確保多執行緒環境中的資料完整性和一致性。

在C#開發中,面對不斷成長的資料和任務,多執行緒程式設計和並發控制顯得格外重要。本文將從多執行緒程式設計和並發控制兩個方面,為大家介紹一些在C#開發中需要注意的事項。一、多執行緒程式設計多執行緒程式設計是一種利用CPU多核心資源提高程式效率的技術。在C#程式中,多執行緒程式設計可以使用Thread類別、ThreadPool類別、Task類別以及Async/Await等方式實作。但在進行多執行緒編

Go中透過Goroutine和並發控制工具(如WaitGroup、Mutex)實現並發編程,可使用第三方函式庫(如sync.Pool、sync.semaphore、queue)擴充其功能。這些程式庫可最佳化並發操作,如任務管理、資源存取限制和程式碼效率提升。一個使用佇列庫處理任務的範例展示了第三方庫在實際並發場景中的應用。

Go語言中http.Transport的同時控制策略與效能最佳化技巧在Go語言中,使用http.Transport可以建立並管理HTTP請求的客戶端。 http.Transport在Go的標準庫中被廣泛使用,並提供了許多可配置的參數,以及並發控制功能。在本文中,我們將討論如何使用http.Transport的同時控制策略來優化效能,並展示一些可行的範例程式碼。一、

並發控制對GoLang效能的影響:記憶體消耗:goroutine消耗額外內存,大量goroutine可能導致記憶體耗盡。調度開銷:創建goroutine會產生調度開銷,頻繁創建銷毀goroutine會影響效能。鎖定競爭:多個goroutine存取共享資源時需要鎖定同步,鎖定競爭會導致效能下降和延遲延長。優化策略:正確使用goroutine:僅在必要時建立goroutine。限制goroutine數量:使用channel或sync.WaitGroup管理並發度。避免鎖定競爭:使用無鎖定資料結構或最小化鎖定持有時間

如何在MySQL中使用分散式鎖定控制並發存取?在資料庫系統中,高並發存取是一個常見的問題,而分散式鎖定是常用的解決方案之一。本文將介紹如何在MySQL中使用分散式鎖定來控制並發訪問,並提供相應的程式碼範例。 1.原理分散式鎖可以用來保護共享資源,確保在同一時間只有一個執行緒可以存取該資源。在MySQL中,可以透過以下的方式實作分散式鎖定:建立一個名為lock_tabl

MySQL和Oracle:對於多版本並發控制和資料一致性的支援對比引言:在當今資料密集型應用中,資料庫系統扮演核心角色,實現資料的儲存和管理。 MySQL和Oracle是兩個著名的關聯式資料庫管理系統(RDBMS),在企業級應用中廣泛使用。在多用戶環境下,確保資料一致性和並發控制是資料庫系統的重要功能。本文將分享MySQL和Oracle在多版本並發控制和數據

MySQL分散式事務處理與同時控制的專案經驗解析近年來,隨著網際網路的快速發展和使用者數量的不斷增加,對於資料庫的要求也日益提高。在大型分散式系統中,MySQL作為最常用的關聯式資料庫管理系統之一,一直扮演著重要的角色。但是,隨著資料規模的增大和並發存取的增加,MySQL的效能和擴展性面臨了嚴峻的挑戰。特別是在分散式環境下,如何處理事務和控制並發成為了一個亟待解
