資料庫鎖的初衷:處理并發問題
- 全域鎖
- 表鎖
- 行鎖
全域鎖:對整個資料庫實體加鎖,MySQL提供了一個加全域讀鎖的方法(FTWRL),Flush tables with read lock,之后整個資料庫處于讀鎖狀態,
使用場景:全庫邏輯備份,就是說把整庫每個表都select出來存成文本,
這個庫變成只讀狀態后:
- 如果在主庫上備份,備份期間都不能執行更新,業務基本上就得停擺
- 在從庫上備份,備份期間從庫不能執行主庫同步過來的
binlog,導致主從延遲,
表級鎖:對整個表進行加鎖,加鎖lock tables xxx read/write,釋放鎖unlock tables xxx,客戶端斷開的時候也會自動釋放表鎖,注意:lock tables語法除了會限制別的執行緒的讀寫外,也限制了本執行緒接下來的操作物件,
在執行緒A中使用lock tables t1 read, t2 write后,其他執行緒寫t1,讀寫t2都會被阻塞,同時,執行緒A在執行unlock tables之前,只能執行讀t1,讀寫t2的操作,
- 共享鎖:讀鎖,共享,互不阻塞,多個客戶在同一時刻可以讀取同一個資源,而互不干擾
- 排他鎖:寫鎖,排他,一個寫鎖會阻塞其他的寫鎖和讀鎖,
排他鎖,能確保在給定的時間里,只有一個用戶能執行寫入,并防止其他用戶讀取正在寫入的同一資源,
MySQL鎖粒度
- 表鎖,
MySQL最基本的鎖策略,也是開銷最小的策略,
會鎖定整張表,一個用戶在對表進行寫操作(插入、洗掉、更新等)前,需要先獲得寫鎖,它會阻塞其他用戶對該表的所有讀寫操作,只有沒有寫鎖時,其他讀取的用戶才能獲得讀鎖,讀鎖之間互不阻塞, - 行鎖,最大程度地支持并發處理(同時也帶來了最大鎖開銷),行級鎖只在存盤引擎層實作,在Server層沒有實作,
注:在MySQL的information_schema庫的innodb_trx表中,可以查到當前執行的事務,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67440.html
標籤:PHP
上一篇:PHPExcel實作匯入匯出功能
下一篇:事務補充(8)
