###### tags: `Notes` `SQL` # SQL LOCK - 為什麼需要 Locks? 因為多筆交易在資料的讀取與寫入的時候,彼此會相互影響, 所以要在資料==被讀取==或是==被寫入==時做一個記號,這個記號用來告知該資料正在被讀取或是寫入的狀態,其他人就可以看這個記號,來決定是否要等待到==該紀錄狀態結束==。就是LOCKS。 > 在找廁所的時候想去某一間,但是他是紅燈、被占用中,你可以根據這個燈號,決定要繼續找還是要等他出來。 ## Lock Granularity (Lock 的層級) ## 粒度 想像一個比較極端的狀況,資料庫的資料同時只能夠有一個人User A寫入,因此 User 寫入資料的時候就會 Lock 該資料,其他人 User B 就要寫入資料就必須要等待,等到User A 資料寫入完畢,Lock 釋放之後,User B 才能進行寫入的動作,實務上,這樣的資料庫並不實用,因為資料庫通常會有多人”同時”寫入與讀取,因為資料庫就必須設定一定的 Lock 與 Isolation 的層級,達到 在多人可以同時存取 交易鎖定的資料完整性 為了達到可以增加多人同時存取, 當使用者 User A 寫入Table A的時候, Lock 就不會針對 整個 Table A or 整個檔案進行鎖定,而是更進一步細分Lock 的最小單位: > 一棟大型的風景區五層樓廁所,每層樓有一個廁所,一個廁所有 5*5 共二十五間。 > > 為了怕兩個人用到同一間廁所,所以加上了一個 使用中的燈號 (LOCK) (我知道很不合理) > 有一個人進去任何一間上廁所的時候: > 1. 整棟廁所都亮紅燈不給人用(==粒度==最大 TABLE-LOCK) > 2. 那個人去的那層樓(n)跟上下一層( n+1, n-1 )亮紅燈(==粒度==小一階 Extent-LOCK) > 3. 該層樓不給用 (==粒度==再小一階,Page Locks) > 4. 如果他去該層樓的男廁小便斗,該層樓的小便斗不給用(==粒度==再小一階 Key-LOCK) > 5. 他去的該間不給用(==粒度==最小,ROW-LOCK) 簡單來說 ==粒度== 這個詞就是==範圍== 粒度粗 :point_right:範圍大 粒度細:point_right: 範圍小 粒度細的優點: 可以精確控制到 鎖哪一間 讓盡可能多人能夠利用這間廁所 缺點: 要安裝很多、很多的燈,成本高 > 這邊的成本是指 需要很多的記憶體空間, > 把每一個row都加一個記號,十萬筆就十萬個記號, > 所以沒必要的話, > 像是我把資料表從 A 資料庫搬去 B 資料庫 > 鎖整張表:point_right:搬移:point_right:解鎖就好, > 不用幫每一筆紀錄都加一個鎖 ### (Row Locks —> Key Locks –> Page Locks –> Extents Locks –> Table Locks) • Row (RID) • Key (KEY) • Page (PAG) • Extent (EXT) • Heap or B-tree (HoBT) • Table (TAB) • File (FIL) • Application (APP) • MetaData (MDT) • Allocation Unit (AU) • Database (DB)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up