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; 這樣就給這行加上了鎖;
在之後的操作中,這一行的操作只有我們自己能操作該行的數據,其它的需要阻塞等待;
主從複製
複製的基本原理:
- slave 會從master讀取binlog來進行數據同步,這些記錄過程叫做二進制日誌事件;
- slave 將master的binary log events拷貝到它的中繼日誌中;
- slave重做中繼日誌中的事件,將改變應用到自己的數據庫中,mysql的複製是異步的且串行化的
複製的基本規則 - 每個slave只有一個master
- 每個master只能有一個唯一的服務器ID
- 每個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;
這樣主機每進行對數據庫的插入和更新 刪除操作都會同步到從機上了。