国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

史上最具體MySQL全局鎖和表鎖

2024-07-24 12:32:06
字體:
來源:轉載
供稿:網友
      根據加鎖的范圍,MySQL里面的鎖大致可以分成全局鎖,表級鎖,行鎖。本文主要講述MySQL全局鎖和表鎖。
  
1. 全局鎖
 
      全局鎖就是對整個數據庫實例加鎖。MySQL 提供了一個加全局讀鎖的方法,命令是Flush tables with read lock (FTWRL)。
 
1.1 全局鎖使用場景
  
     全局鎖的典型使用場景是,做全庫邏輯備份(mysqldump)。重新做主從時候
     也就是把整庫每個表都 select 出來存成文本。
      以前有一種做法,是通過 FTWRL 確保不會有其他線程對數據庫做更新,然后對整個庫做備份。注意,在備份過程中整個庫完全處于只讀狀態。
 
1.2 不加鎖產生的問題
 
比如手機卡,購買套餐信息
 
這里分為兩張表 u_acount (用于余額表),u_pricing (資費套餐表)
步驟:
1. u_account 表中數據 用戶A 余額:300
    u_pricing 表中數據 用戶A 套餐:空
2. 發起備份,備份過程中先備份u_account表,備份完了這個表,這個時候u_account 用戶余額是300
3. 這個時候套用戶購買了一個資費套餐100,餐購買完成,寫入到u_print套餐表購買成功,備份期間的數據。
4. 備份完成
 
可以看到備份的結果是,u_account 表中的數據沒有變, u_pricing 表中的數據 已近購買了資費套餐100.
 
1.3 為什么需要全局讀鎖(FTWRL)
  
可能有的人在疑惑,官方自帶的邏輯備份工具是 mysqldump。當 mysqldump 使用參數--single-transaction的時候,導數據之前就會啟動一個事務,來確保拿到一致性快照視圖。而由于 MVCC 的支持,這個過程中數據是可以正常更新的。
 
1.4 全局鎖兩種方法
 
一、FLUSH TABLES WRITE READ LOCK
二、set global readonly=true
  
既然要全庫只讀,為什么不使用 set global readonly=true 的方式呢?確實 readonly 方式也可以讓全庫進入只讀狀態,但我還是會建議你用 FTWRL 方式,主要有幾個原因:
 
一是,在有些系統中,readonly 的值會被用來做其他邏輯,比如用來判斷一個庫是主庫還是備庫。因此,修改 global 變量的方式影響面更大,我不建議你使用。
 
二是,在異常處理機制上有差異。如果執行FTWRL 命令之后由于客戶端發生異常斷開,那么 MySQL 會自動釋放這個全局鎖,整個庫回到可以正常更新的狀態。而將整個庫設置為 readonly 之后,如果客戶端發生異常,則數據庫就會一直保持 readonly 狀態,這樣會導致整個庫長時間處于不可寫狀態,風險較高。
 
三是,readonly 對super用戶權限無效
 
注 :業務的更新不只是增刪改數據(DML),還有可能是加字段等修改表結構的操作(DDL)。不論是哪種方法,一個庫被全局鎖上以后,你要對里面任何一個表做加字段操作,都是會被鎖住的。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泾阳县| 青田县| 丹巴县| 灵台县| 满城县| 常熟市| 澄城县| 贵州省| 镇远县| 新源县| 英吉沙县| 禹城市| 平武县| 星座| 新余市| 方山县| 神木县| 通山县| 周口市| 通化县| 湘阴县| 甘德县| 绩溪县| 大姚县| 吉木萨尔县| 闽清县| 含山县| 东兴市| 清苑县| 郁南县| 灵石县| 郎溪县| 景宁| 临邑县| 房产| 陆丰市| 大埔区| 浮山县| 通道| 阿克陶县| 商河县|