Mariadb之顯式使用表鎖和行級鎖

2022-03-17 14:03:05 字數 2175 閱讀 7418

首先我們來看看mariadb的鎖的概念,所謂鎖就是當乙個程序或事務在操作某一資源時,為了防止其他使用者或者程序或事務對其進行資源操作,導致資源搶占而發生衝突,通常在a程序操作該資源時,會對該資源進行加鎖,實現多程序或多使用者操作同一資源時,不會發生衝突;通常情況鎖的型別分讀鎖和寫鎖,所謂讀鎖就是共享鎖,它可以實現多個讀操作共享;而寫鎖就是排它鎖,獨佔鎖,一旦加了寫鎖,其他使用者的讀寫操作將被阻塞,直到該寫鎖被釋放或者因超時而被釋放,在其他使用者進行的讀寫操作,此時就會被執行;對於鎖定範圍來講,它又可以分為,表鎖和行鎖,從字面意思就可以理解到,表鎖就是針對整張表所施加的鎖,而這種鎖定力度相當粗糙,併發相對就比較低,但是維持鎖狀態鎖消耗的成本資源就較小;對於行鎖來說,它針對的範圍就是行級別所施加的鎖,這種鎖的粒度就相對要精細,同時併發相對較高,但是維護鎖狀態消耗的成本資源就相對要大;對於mysql來講又鎖分為儲存引擎級別的鎖和mysql server級別的鎖,儲存引擎級別的鎖指的是對於何時施加鎖或者釋放鎖由儲存引擎自行決定;mysql server級別鎖指的是使用者使用命令可自行決定施加鎖或釋放鎖;簡單講就是允許使用者顯式請求加鎖或釋放鎖;顯式鎖就是使用者手動用命令施加的鎖,隱式鎖指的是由儲存引擎根據需要自行施加的鎖;對於innodb儲存引擎來講,它支援事務,行級鎖;而早期的myisam儲存引擎它不支援事務,對鎖的粒度是表級鎖,不支援行級鎖;

顯示鎖的使用

1)lock tables

指令使用語法:

lock tables  tbl_name  read|write, tbl_name read|write, ...

示例:

測試:對test_tb表進行寫操作,看看是否能夠寫進去?

測試:對test_tb表進行讀操作,看看是否能夠進行呢?

測試:對test_tb表施加寫鎖

測試:對test_tb進行寫操作,看看是否能夠進行?

測試:在其他終端看看是否能夠對test_tb表進行讀寫操作呢?

總結:對於施加讀鎖的表,是可以進行讀操作的,但是不能進行寫操作,包括當前終端也不能寫操作;對於施加寫鎖的表,在當前施加鎖的終端上是可以對其進行讀寫操作的,但是在別的終端讀寫操作都將阻塞;

除了以上指令來對錶進行加鎖外,還可以使用 flush tables指令來加讀鎖,具體語法請看下面;

flush tables tbl_name,... [with read lock];

測試:加讀鎖

行級鎖:select cluase [for update | lock in share mode]

行級排它鎖

行級共享鎖

測試:在當前事務中更新資料,看看是否可更新?

在其他事務中修改資料,看看是否可修改?

總結:innodb儲存引擎的行級鎖依賴索引,如果沒有索引,就相當於表級鎖;對於排它鎖來講,獲取到排它鎖的事務是可以正常修改更新以及加共享鎖,對於沒有獲取到排它鎖的事務,是不能夠對有鎖的行進行修改更新以及加鎖的操作;對於共享鎖來講,對於當前事務(加鎖操作的事務)是可以正常修改更新有鎖的行,對於其他事務,是不可修改和更新有鎖的行;

顯式鎖和AQS

實現鎖的關鍵在於 通過cas操作與volatile變數互相配合,執行緒安全的修改鎖標誌位 基於clh佇列,實現鎖的排隊策略,對於公平鎖,當前執行緒只需要監控他的前驅節點的鎖情況,當前鎖持有這肯定是頭節點 個人理解記錄 reentrantlock基於aqs實現,他的基本原理是aqs的status為0時...

顯式鎖和AQS

lock介面和核心方法 lock介面和synchronized的比較 synchronized 簡潔,lock 獲取鎖可以被中斷,超時獲取鎖,嘗試獲取鎖,讀多寫少用讀寫鎖 可重入鎖reentrantlock 所謂鎖的公平和非公平 如果在時間上,先對鎖進行獲取的請求,一定先被滿足,這個鎖就是公平的,不...

在不使用顯式鎖的方式下使用多執行緒

乙個串被定義為序列的呼叫事件控制代碼 非並行呼叫 使用串允許在多執行緒環境中執行 而不使用顯示的互斥鎖。串可以是隱式的或者顯式的,如下方的可替代方法所示 僅在乙個執行緒中呼叫io service run 意味著使用隱式的串執行所有的事件控制代碼,因為io service確保了控制代碼只被run 內部...