mysql數據庫鎖機制以及主從複製

mysql鎖的分類:
對於數據操作類型來分的話 分爲讀鎖和寫鎖;
對於數據操作的粒度來說分爲表鎖和行鎖;
表鎖來說:偏向於MyISAM存儲引擎,開銷小,加鎖快;無死鎖,鎖的粒度大,發生鎖衝突的概率最高,併發度最低;

show open tables;查看錶的信息

加鎖 加讀鎖之後只能對錶進行讀取操作,不能對錶做寫操作;

表鎖

加鎖的命令:
加讀鎖:lock table mylock read;
注意:
在多個窗口對同一個表進行操作的時候;會產生阻塞情況,直到獲取鎖進行操作爲止,
同一個窗口 如果對某個表上鎖,那麼該窗口就不能在操作其它的表了;
加寫鎖:
lock table mylock write;
注意:
同一窗口,自己可以對錶進行查詢和寫操作;
不同窗口 在對錶進行讀取和寫的操作會產生阻塞情況 直到釋放鎖爲止;

解鎖
解鎖的命令: unlock table mylock;

行鎖

偏向於innodb存儲引擎,開銷大,加鎖慢,會出現死鎖,鎖的粒度最小,發生鎖衝突的概率最低,併發度最高
innodb和myisam的最大區別就是 1,支持事務 2. 支持行級鎖
事務的acid特性,
原子性 :事務是一個操作單元,其對數據的修改,要麼全部執行,要麼全都不執行
持久性 :事務完成之後,其對數據的操作是永久性的
隔離性 :數據庫提供一定的隔離機制,保證事務在不受外部併發操作影響的“獨立”環境執行,着以爲着事務處理過程中的中間狀態對外部是不可見的
一致性:在事務的開始和完成時,數據都必須保持一致狀態,這以爲着所有相關的操作,都必須應用於事務的修改,以保持數據的完整性。

併發帶來的數據衝突問題

先介紹幾個概念:
事務的隔離級別以及安全級別:
讀未提交 《 讀已提交 《 可重複讀 《 序列化讀

髒讀:已修改但尚未提交,事務a讀取到了事務b已經修改但是還沒有提交的數據
不可重複讀:再讀取已經讀過的數據時,發生數據已經發生了變化;
幻讀:事務a讀取到了事務b新增的數據,前提是兩個事務是同時發生的。不符合事務的隔離性;

查看當前數據庫的事務隔離級別:
show variables like “tx_isolation”;

關於mysql是如何實現行級鎖的mysql通過mvcc多版本控制協議實現行級鎖
深入理解mysql四種隔離級別及底層實現原理(MVCC和鎖)

索引失效後行鎖變表鎖;mysql默認是根據索引來進行上鎖的。行鎖是建立再索引上的鎖,索引失效之後會變成表鎖

什麼是間隙鎖?

當我們用範圍條件而不是相等條件檢索數據,並請求共享或排他鎖時,innodb會給符合條件的已有數據記錄的索引項加鎖;對於鍵值在條件範圍內但是並不存在的記錄,叫做間隙

innodb 也會對這個間隙加鎖,這種鎖機制就是所謂的間隙鎖

危害:因爲query在執行過程中通過範圍查找,他會鎖定整個範圍內所有的索引鍵值,即使這個鍵值並不存在。
間隙鎖有一個比較致命的弱點,就是當鎖定一個範圍鍵值之後,即使某些不存在的鍵值也會被無辜的鎖定,而造成鎖定的時候無法插入鎖定範圍內的任何數據。
比如我們的數據庫中有id範圍1-6的數據 但是沒有id=5的值 我們在另一個窗口添加id=5的值時會發生阻塞情況;
在這裏插入圖片描述

如何鎖定一行

語句後面加上先查詢某一行並在後面加上for update; 這樣就給這行加上了鎖;
在之後的操作中,這一行的操作只有我們自己能操作該行的數據,其它的需要阻塞等待;

主從複製

複製的基本原理:

  1. slave 會從master讀取binlog來進行數據同步,這些記錄過程叫做二進制日誌事件;
  2. slave 將master的binary log events拷貝到它的中繼日誌中;
  3. slave重做中繼日誌中的事件,將改變應用到自己的數據庫中,mysql的複製是異步的且串行化的 在這裏插入圖片描述
    複製的基本規則
  4. 每個slave只有一個master
  5. 每個master只能有一個唯一的服務器ID
  6. 每個master可以有多個slave

主從配置常見配置

  • mysql版本一致且後臺以服務運行
  • 主從都配置在[mysqld]結點下,都是小寫
  • 在主mysql服務器上配置唯一的id server-id=1
  • 配置logbin所在的位置
  • log-bin=D:/mysql-8/data/mysqlbin
  • log-err=D:/mysql-8/data/mysqlerr
  • basedir=D:/mysql-8/
  • tmpdir=D:/mysql-8/
    從數據庫的配置:
    關閉server-id=1 開啓server-id=2

授權從機對主機登錄操作;
grant replication slave on . to “zhangsan”@“從機器數據庫的ip” identifed by “密碼”‘;
刷新權限:flush preivileges;
在這裏插入圖片描述
配置從機:
告訴從機的數據庫從主機的哪個位置開始備份
命令

change master to master_host = "192.168.14.165",
master_user="zhangsan",
master_password ="123456",
master_log_file="mysqlbin.000035",master_log_pos=341;

然後接着啓動從機

start slave\G;

在這裏插入圖片描述
這樣主機每進行對數據庫的插入和更新 刪除操作都會同步到從機上了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章