① 下列什麼不是mysql資料庫鎖級別
MySQL有三種鎖的級別:頁級、表級、行級。MySQL是一個關系型資料庫管理系統,由瑞典MySQL AB 公司開發,屬於 Oracle 旗下產品。MySQL 是最流行的關系型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的RDBMS應用軟體之一。
② mysql中的鎖都有哪些
MySQL 中有哪些鎖?資料庫中鎖的設計初衷處理並發問題,作為多用戶共享資源,當出現並發訪問的時候,資料庫需要合理控制資源訪問規則。鎖就是實現這些訪問規則中的重要數據。
鎖的分類根據加鎖范圍,MySQL 裡面的鎖可以分成 全局鎖 、 表級鎖 、 行鎖 三類。
全局鎖全局鎖,就是對整個資料庫實例加鎖,MySQL 提供了一個加全局讀鎖的方法,命令是:
Flush tables with read lock (FTWRL)當需要整個庫只讀狀態的時候,可以使用這個命令,之後其他線程的:數據更新語句(增刪改),數據定義語句(建表,修改表結構)和更新事務的提交語句將會被阻塞。
全局鎖的使用場景全局鎖的定型使用場景,做 全庫邏輯備份 。也就是把整個庫每個表都 Select 出來,然後存成文本。
如何整個庫都只讀,會有什麼問題? 如果你在主庫上備份,那麼在備份期間都不能執行更想,業務就基本上停擺。 如果在從庫上備份,那麼備份期間從庫不能執行主庫同步過來的 binlog ,會導致從延遲。 既然要全庫只讀, 為什麼不使用set global readonly=true的方式呢?readonly 方式也可以讓全庫進入只讀狀態,但我還是會建議你用FTWRL方式, 主要有兩個原因:
一是, 在有些系統中, readonly的值會被用來做其他邏輯,比如用來判斷一個庫是主庫還是備庫。因此,修改global變數的方式影響面更大, 我不建議你使用。 二是, 在異常處理機制上有差異。如果執行FTWRL命令之後由於客戶端發生異常斷開, 那麼MySQL會自動釋放這個全局鎖, 整個庫回到可以正常更新的狀態。而將整個庫設置為readonly之後, 如果客戶端發生異常, 則資料庫就會一直保持readonly狀態, 這樣會導致整個庫長時間處於不可寫狀態, 風險較高 表級別鎖MySQL 裡面表級別的鎖有兩種:一種是表鎖,一種是元數據鎖(meta data lok, MDL)。表鎖的語法是 :
lock tables ... read/write與 FTWRL 類似,可以使用 unlock tables 主動釋放鎖,也可以在客戶端斷開的時候自動釋放。需要注意的是,lock tables語法除了會限制別的線程的讀寫外,也限定了本線程接下來的操作對象。
MDL 表級鎖MDL 不需要顯示使用,在訪問一個表的時候自動加上, MDL 保證讀寫的正確性,也就是說在查詢數據時,不允許有其他線程對這個表結構做變更。
什麼操作會加 MDL 鎖?在MySQL 5.5版本中引入了MDL, 當對一個表做增刪改查操作的時候,加 MDL讀鎖 ;當要對表做結構變更操作的時候,加 MDL寫鎖 。
讀鎖之間不互斥,因此可以有多個線程同時對一張表增刪改查。 讀寫之間、寫鎖之間是互斥的,用來保證變更表結構操作的安全性,如果有兩個線程要同時給一個表加欄位,其中一個要等另外一個執行完才能執行。 更改表結構要注意哪些?給一個表加欄位, 或者修改欄位, 或者加索引, 需要掃描全表的數據。在對大表操作的時候, 你肯定會特別小心, 以免對線上服務造成影響。而實際上, 即使是小表, 操作不慎也會出問題,導致整個庫的線程爆滿。
舉個例子我們來看一下下面的操作序列, 假設表t是一個小表。
image
session A先啟動, 這時候會對表t加一個 MDL讀鎖 。由於session B需要的也是 MDL讀鎖 , 因此可以正常執行。 session C會被blocked, 是因為session A的MDL讀鎖還沒有釋放, 而session C需要MDL寫鎖, 因此只能被阻塞,讀寫鎖互斥。 如果只有session C自己被阻塞還沒什麼關系, 但是之後所有要在表t上新申請MDL讀鎖的請求也會被session C阻塞。前面我們說了,所有對表的增刪改查操作都需要先申請MDL讀鎖, 就都被鎖住, 等於這個表現在完全不可讀寫了。如果某個表上的查詢語句頻繁, 而且客戶端有重試機制,也就是說超時後會再起一個新session 再請求的話, 這個 庫的線程很快就會爆滿 。事務中的MDL鎖, 在語句執行開始時申請, 但是語句結束後並不會馬上釋放, 而會等到整個事務提交後再釋放。
怎麼解決這個 更改表結構問題比較理想的機制是, 在alter table語句裡面設定等待時間, 如果在這個指定的等待時間裡面能夠拿到MDL寫鎖最好, 拿不到也不要阻塞後面的業務語句, 先放棄。
ALTER TABLE tbl_name NOWAIT add column ... ALTER TABLE tbl_name WAIT N add column ...③ orcal資料庫表被鎖了怎麼解鎖
1、在做Oracle監聽程序測試時,發現帳戶已經被鎖定。
④ Oracle中的鎖
>>>>>這些是基礎,必須掌握:鎖定的概念:鎖定是資料庫用來控制共享資源並發布訪問的機制。在多用戶環境下,多個用戶可同時訪問相同的數據。Oracle 提供鎖以確保在多用戶環境下數據的完整性和一致性。在提交或回滾事務之前,Oracle 會鎖定正被修改的數據。在用戶完成或回滾事務之後,鎖會自動釋放。只有在提交或回滾事物之後,其他用戶才可以更新這些數據。鎖的兩種級別為:行級鎖和表級鎖。行級鎖主要用於特定的行,表級鎖主要用於整個表,下面我就行級鎖和表級鎖來個說明:行級鎖行級鎖只對用戶正在訪問的行進行鎖定。如果該用戶正在修改某行,那麼其他用戶就可以更新同一表中該行之外的數據。例如:如果用戶1正在更新Jobs 表中的第一行,則用戶2可以同時修改該表中的第二行。也就是說除了該表中的第一行,其他用戶可以修改任意行,但是第一行的數據其他用戶只能select。行級鎖是一種排他鎖,防止其他事務修改此行,但是不會阻止讀取此行的操作。在使用INSERT、UPDATE、DELETE 和SELECT…FOR UPDATE 等 語句時,Oracle 會自動應用行級鎖鎖定。SELECT...FOR UPDATE 語句允許用戶每次選擇多行記錄進行更新,這些記錄會被鎖定,且只能由發起查詢的用戶進行編輯。只有在回滾或提交事務之後,鎖定才會釋放,其他用戶才可以編輯這些記錄。SELECT...FOR UPDATE 語句的語法如下: SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT];其中:OF 子句用於指定即將更新的列,即鎖定行上的特定列。WAIT 子句指定等待其他用戶釋放鎖的秒數,防止無限期的等待。「使用FOR UPDATE WAIT」子句的優點如下:⒈防止無限期地等待被鎖定的行;⒉允許應用程序中對鎖的等待時間進行更多的控制。⒊對於互動式應用程序非常有用,因為這些用戶不能等待不確定舉例:比如一個用戶在SQL PLUS下輸入這條語句:SQL>SELECT * FROM order_master WHERE vencode='V002' FOR UPDATE;此時再開啟一個SQL PLUS,以相同的用戶登陸,執行下面的命令。SQL<> SELECT * FROM order_master WHERE vencode='V02' FOR UPDATE WAIT 5;由於要更新的行已經被鎖定,上述命令在等待5秒鍾之後返回,並給出如下的錯誤信息:ERROR 位於第1行;ORA-30006;資源已被佔用;執行操作時出現WAIT超時。PS:再開啟的SQL PLUS 是以相同用戶登陸的,用其他用戶登陸更是不可能。表級鎖表級鎖被鎖定的表,暫時放在內存中,不提交不進去資料庫,也就是說,多個用戶在同一時間,同時修改同一個表的同一行時,同時點提交,但是還是按隨機的先後被提交進資料庫,而不是同時被提交,而是先隨機存儲後,被再次提交的覆蓋。表級鎖將保護表數據,在事務處理過程中,表級鎖會限制對整個表的訪問。可以使用LOCK TABLE 語句顯示地鎖定表。表級鎖用來限制對表執行添加、更新和刪除等修改操作。鎖定表的語法如下:LOCK TABLE <table_name> IN <lock_mode> MODE [NOWAIT];其中:lock_mode 是鎖定的模式。NOWAIT 關鍵字用於防止無限期的等待其他用戶釋放鎖。表級鎖的模式包括以下內容:行共享 (ROW SHARE, RS): 允許其他用戶訪問和鎖定該表,但是禁止排他鎖定整個表。行共享鎖鎖定後,在同一時刻,不同用戶可以對同一個表中的被行共享鎖鎖定後的該行,具備增、刪、改、查的功能。行排他(ROW EXCLUSIVE, RX):與行共享模式相同,同時禁止其他用戶在此表上使用共享鎖。使用SELECT...FOR UPDATE 語句會在表上自動應用排他鎖。被行排他後,其他用戶不能同時修改該行,但是可以插入行,可以查詢該行,其他用戶也不能再在該表上對此行進行排他。共享(SHARE, S):共享鎖將鎖定表,僅允許其他用戶查詢表中的行,但不允許插入、更新或刪除行。多個用戶可以同時在同一個表中放置共享鎖,即允許資源共享,因此得名「共享鎖」。例如,如果用戶每天都需要在結帳時更新日銷售表,則可以在更改該表時使用共享鎖以確保數據的一致性。也就是說該表只能查,其他用戶想修改表中行的數據,只需要對該表進行共享鎖。共享行排他(SHARE ROW EXCLUSIVE , SPX):執行比共享表更多的限制。防止其他事務在表上應用共享鎖、共享行排他鎖以及排他鎖。共享行排他是除了該行以外的其他行也不能增、刪、改。只能在此表中加低級表。要是想在該表中更改其他行的數據,就只有其他用戶對該行進行共享行排他鎖,也僅僅只能修改被這個用戶鎖定的行,而其他的行也修改不了。排他(EXCLUSIVE,E):對表執行最大限制。除了允許其他用戶查詢該表的記錄,排他鎖防止其他事務對表做任何更改或在表上應用任何類型的鎖。這個鎖應該叫鎖中之王,他鎖住了的話,其他用戶就只有查詢的功能了,就別想在該表中干別的事了。BTW:在能加很多鎖的表中,如果第一個用戶對該表鎖定時,沒有使用「NOWAIT」語句,是需要第一個用戶對該表COMMIT或ROLLBACK 命令釋放鎖定後,其他用戶才能對該表進行鎖定。如果其他用戶違反了該條,就會無期限的等待。。。。SQL> LOCK TABLE order_mater IN SHARE MODE;而使用下面的語句就可以很少的預防這種情況的存在:SQL> LOCK TBALE order_mater IN SHARE MODE NOWAIT;>>>>>這是些擴展的內容,供大家參考
1 引言—資料庫鎖的基本概念 為了確保並發用戶在存取同一資料庫對象時的正確性(即無丟失修改、可重復讀、不讀「臟」數據),資料庫中引入了鎖機制。基本的鎖類型有兩種:排它鎖(Exclusive locks記為X鎖)和共享鎖(Share locks記為S鎖)。 排它鎖:若事務T對數據D加X鎖,則其它任何事務都不能再對D加任何類型的鎖,直至T釋放D上的X鎖;一般要求在修改數據前要向該數據加排它鎖,所以排它鎖又稱為寫鎖。 共享鎖:若事務T對數據D加S鎖,則其它事務只能對D加S鎖,而不能加X鎖,直至T釋放D上的S鎖;一般要求在讀取數據前要向該數據加共享鎖,所以共享鎖又稱為讀鎖。 2 Oracle 多粒度封鎖機制介紹 根據保護對象的不同,Oracle資料庫鎖可以分為以下幾大類: (1) DML lock(data locks,數據鎖):用於保護數據的完整性; (2) DDL lock(dictionary locks,字典鎖):用於保護資料庫對象的結構(例如表、視圖、索引的結構定義); (3) internal locks 和l a t c h es(內部鎖與閂):保護內部資料庫結構; (4) distributed locks(分布式鎖):用於OPS(並行伺服器)中; (5) PCM locks(並行高速緩存管理鎖):用於OPS(並行伺服器)中。 本文主要討論DML(也可稱為data locks,數據鎖)鎖。從封鎖粒度(封鎖對象的大小)的角度看,Oracle DML鎖共有兩個層次,即行級鎖和表級鎖。 2.1 Oracle的TX鎖(行級鎖、事務鎖) 許多對Oracle不太了解的技術人員可能會以為每一個TX鎖代表一條被封鎖的數據行,其實不然。TX的本義是Transaction(事務),當一個事務第一次執行數據更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進行查詢時,它即獲得一個TX(事務)鎖,直至該事務結束(執行COMMIT或ROLLBACK操作)時,該鎖才被釋放。所以,一個TX鎖,可以對應多個被該事務鎖定的數據行。 在Oracle的每行數據上,都有一個標志位來表示該行數據是否被鎖定。Oracle不象其它一些DBMS(資料庫管理系統)那樣,建立一個鏈表來維護每一行被加鎖的數據,這樣就大大減小了行級鎖的維護開銷,也在很大程度上避免了其它資料庫系統使用行級封鎖時經常發生的鎖數量不夠的情況。數據行上的鎖標志一旦被置位,就表明該行數據被加X鎖,Oracle在數據行上沒有S鎖。
2.2 TM鎖(表級鎖) 2.2.1 意向鎖的引出 表是由行組成的,當我們向某個表加鎖時,一方面需要檢查該鎖的申請是否與原有的表級鎖相容;另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。比如一個事務要在一個表上加S鎖,如果表中的一行已被另外的事務加了X鎖,那麼該鎖的申請也應被阻塞。如果表中的數據很多,逐行檢查鎖標志的開銷將很大,系統的性能將會受到影響。為了解決這個問題,可以在表級引入新的鎖類型來表示其所屬行的加鎖情況,這就引出了「意向鎖」的概念。 意向鎖的含義是如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。如:對表中的任一行加鎖時,必須先對它所在的表加意向鎖,然後再對該行加鎖。這樣一來,事務對表加鎖時,就不再需要檢查表中每行記錄的鎖標志位了,系統效率得以大大提高。 2.2.2 意向鎖的類型 由兩種基本的鎖類型(S鎖、X鎖),可以自然地派生出兩種意向鎖: 意向共享鎖(Intent Share Lock,簡稱IS鎖):如果要對一個資料庫對象加S鎖,首先要對其上級結點加IS鎖,表示它的後裔結點擬(意向)加S鎖; 意向排它鎖(Intent Exclusive Lock,簡稱IX鎖):如果要對一個資料庫對象加X鎖,首先要對其上級結點加IX鎖,表示它的後裔結點擬(意向)加X鎖。 另外,基本的鎖類型(S、X)與意向鎖類型(IS、IX)之間還可以組合出新的鎖類型,理論上可以組合出4種,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不難看出,實際上只有S+IX有新的意義,其它三種組合都沒有使鎖的強度得到提高(即:S+IS=S,X+IS=X,X+IX=X,這里的「=」指鎖的強度相同)。所謂鎖的強度是指對其它鎖的排斥程度。 這樣我們又可以引入一種新的鎖的類型。 共享意向排它鎖(Shared Intent Exclusive Lock,簡稱SIX鎖) :如果對一個資料庫對象加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX。例如:事務對某個表加SIX鎖,則表示該事務要讀整個表(所以要對該表加S鎖),同時會更新個別行(所以要對該表加IX鎖)。 這樣資料庫對象上所加的鎖類型就可能有5種:即S、X、IS、IX、SIX。 具有意向鎖的多粒度封鎖方法中任意事務T要對一個資料庫對象加鎖,必須先對它的上層結點加意向鎖。申請封鎖時應按自上而下的次序進行;釋放封鎖時則應按自下而上的次序進行;具有意向鎖的多粒度封鎖方法提高了系統的並發度,減少了加鎖和解鎖的開銷。 2.2.3 Oracle的TM鎖(表級鎖) Oracle的DML鎖(數據鎖)正是採用了上面提到的多粒度封鎖方法,其行級鎖雖然只有一種(即X鎖),但其TM鎖(表級鎖)類型共有5種,分別稱為共享鎖(S鎖)、排它鎖(X鎖)、行級共享鎖(RS鎖)、行級排它鎖(RX鎖)、共享行級排它鎖(SRX鎖),與上面提到的S、X、IS、IX、SIX相對應。需要注意的是,由於Oracle在行級只提供X鎖,所以與RS鎖(通過SELECT … FOR UPDATE語句獲得)對應的行級鎖也是X鎖(但是該行數據實際上還沒有被修改),這與理論上的IS鎖是有區別的。 下表為Oracle資料庫TM鎖的相容矩陣(Y=Yes,表示相容的請求; N=No,表示不相容的請求;-表示沒有加鎖請求):
T2
T1 S X RS RX SRX -
----------------------------------------------------
S Y N Y N N Y
X N N N N N Y
RS Y N Y Y Y Y
RX N N Y Y N Y
SRX N N Y N N Y
- Y Y Y Y Y Y
表一:Oracle資料庫TM鎖的相容矩陣 一方面,當Oracle執行SELECT…FOR UPDATE、INSERT、UPDATE、DELETE等DML語句時,系統自動在所要操作的表上申請表級RS鎖(SELECT…FOR UPDATE)或RX鎖(INSERT、UPDATE、DELETE),當表級鎖獲得後,系統再自動申請TX鎖,並將實際鎖定的數據行的鎖標志位置位(指向該TX鎖);另一方面,程序或操作人員也可以通過LOCK TABLE語句來指定獲得某種類型的TM鎖。下表總結了Oracle中各SQL語句產生TM鎖的情況: SQL語句 表鎖模式 允許的鎖模式
-------------------------------------------------------------------------------------------------
Select * from table_name…… 無 RS、RX、S、SRX、X
Insert into table_name…… RX RS、RX
Update table_name…… RX RS、RX
Delete from table_name…… RX RS、RX
Select * from table_name for update RS RS、RX、S、SRX
lock table table_name in row share mode RS RS、RX、S、SRX
lock table table_name in row exclusive mode RX RS、RX
lock table table_name in share mode S RS、S
lock table table_name in share row exclusive mode SRX RS
lock table table_name in exclusive mode X 無