天天看點

Mysql性能優化 - innodb的事務和鎖Mysql性能優化 - innodb的事務和鎖

文章目錄

  • Mysql性能優化 - innodb的事務和鎖
    • 事務
      • 什麼是事務
      • 事務ACID特性
      • 事務并發會産生的問題
      • 事務的四種隔離級别
        • innodb 鎖類型

Mysql性能優化 - innodb的事務和鎖

事務

什麼是事務

事務資料庫中的最小操作單元,是一組不可再分割的操作集合

mysql中開啟事務

begin/start transaction -》 commit/ rollback 手動啟動事務送出或者復原

set session autocommit = on/off 設定事務是否自動開啟

事務ACID特性

原子性(Atomicity)

最小工作單元,要麼都執行,要麼都不執行

一緻性(Consistency)

事務中操作的資料及狀态改變是一緻的,即寫入的資料的結果必須完全符合預設的規則,不會因為出現的系統意外等原因導緻狀态不一緻

隔離性(Isolation)

一個事務所操作的資料在送出之前,對其他事務的可見性設定(一般設定為不可見)

持久性(Durability)

事務所做的修改就會永久儲存,不會因為系統意外導緻資料的丢失

事務并發會産生的問題

髒讀

一個事務讀取到了另一個事務尚未進行事務送出的資料

Mysql性能優化 - innodb的事務和鎖Mysql性能優化 - innodb的事務和鎖

不可重複讀

一個事務的操作導緻另一個事務前後兩次讀取到不同的資料

Mysql性能優化 - innodb的事務和鎖Mysql性能優化 - innodb的事務和鎖

幻讀

一個事務的操作導緻另一個事務前後兩次查詢的結果資料量不同

Mysql性能優化 - innodb的事務和鎖Mysql性能優化 - innodb的事務和鎖

事務的四種隔離級别

SQL92 ANSI/ISO标準

Read Uncommited(未送出讀)

事務未送出對其他事務也是可見的,導緻髒讀

Read Committed(送出讀)

一個事務開始之後,隻能看到自己送出事務所做的修改,解決了髒讀問題,但是有不可重複讀問題

Repeatable Read(可重複讀)

在同一個事務中多次讀取同樣的資料結果是一樣的,解決了不可重複讀問題,為解決幻讀

Serializable(串行化)

最高隔離級别,強制事務串行執行

innodb對隔離級别的支援程度

Mysql性能優化 - innodb的事務和鎖Mysql性能優化 - innodb的事務和鎖

表鎖和行鎖

鎖是用于管理不同僚務對共享字段的并發通路

表鎖和行鎖的差別

  • 鎖定粒度: 表鎖 > 行鎖
  • 加鎖效率: 表鎖 > 行鎖
  • 沖突機率: 表鎖 > 行鎖
  • 并發性能: 表鎖 < 行鎖

Innodb 支援表鎖和行鎖(表鎖為鎖所有行)

innodb 鎖類型

  • 共享鎖(行鎖)
  • 排他鎖(行鎖)
  • 意向鎖共享鎖(表鎖)
  • 意向鎖排他鎖(表鎖)
  • 自增鎖

鎖算法

  • 記錄鎖
  • 間隙鎖
  • 臨鍵鎖

共享鎖

共享鎖又稱為讀鎖,簡稱s鎖,共享鎖多個事務可以對于同一資料共享一把鎖,都能通路到資料,但是隻能讀不能改

加鎖: select * from users where id=1 LOCK IN SHARE MODE

解鎖:commit/rollback

排他鎖

排他鎖又稱為寫鎖,簡稱X鎖,排他鎖不能與其他鎖并存,一個事務獲得了一個資料行的排他鎖,其他事務就不能再擷取該行的鎖(共享鎖,排他鎖),隻有擷取了排他鎖的事務是可以對資料進行讀取和修改的(其他事務讀取的資料來自于快照)

加鎖:delete/update/insert預設加上x鎖 select * from 。。。。。FOR UPDATE

解鎖:commit/rollback

innodb鎖的實作

Innodb的行鎖是通過給索引上的索引項加鎖來實作的。

隻有通過索引條件進行資料檢索,Innodb才能使用行級鎖,否則,将使用表鎖

表鎖:lock tables xx read/write

意向共享鎖(IS)

表示事務準備給資料行加入共享鎖,即一個資料行加共享鎖前必須先取得該表的IS鎖,意向共享鎖之間是可以互相相容的

意向排他鎖(IX)

表示事務準備給資料行加入排他鎖,即一個資料行加排他鎖之前必須先取得該表的IX鎖,意向排他鎖之間是可以互相相容的

意向鎖是innodb資料庫操作之前自動加的,不需要使用者幹預,當事務想去進行鎖表時,可以先判斷意向鎖是否存在,存在時則可以快速傳回該表不能啟用表鎖

自增鎖

針對自增列自增長的一個特殊表鎖,預設值取1代表連續,事務未送出ID永久丢失

死鎖

  • 多個事務并發
  • 每個事務都持有鎖
  • 每個事務都需要再繼續持有鎖
  • 事務之間産生加鎖的循環等待,形成死鎖

避免死鎖

  1. 類似的業務邏輯以固定的順序通路表和行
  2. 大事務拆成小事務
  3. 同一個事務中,盡可能一次鎖定所有需要的資源,減少死鎖的機率
  4. 在業務允許的情況下降低隔離級别
  5. 添加合理索引,防止直接鎖住全表