X鎖 | S鎖 | |
---|---|---|
X鎖 | 衝突 | 衝突 |
S鎖 | 衝突 | 不衝突 |
select * from table_a lock in share modemysql
使用場景:讀出數據後其餘事務不能修改,但本身也不必定能修改,由於其餘事務也能夠加讀鎖。主要用來保證數據在本事務內值不會變。但實際開發中用得比較少。sql
select * from table_a for update 以及 DELETE/UPDATE/INSERT(插入後未提交的數據也會加寫鎖)性能
使用場景:只有本事務才能夠修改這些數據,其餘事務加鎖會阻塞。通常開發過程當中大部分接觸到的鎖都是寫鎖。索引
行鎖又分爲:事務
select * from table_a where a = 1 for update開發
事務隔離級別爲讀提交時 會對查詢出的全部每條數據加行鎖(單個行記錄上鎖),但此時其餘事務能夠針對這個數據範圍insert形成幻讀。table
當事務隔離級別爲可重複讀時(mysql默認的事務隔離級別) 若是走索引,mysql經過索引知道數據的範圍,會對查詢出的數據範圍間隙及數據自己加鎖,其餘事務針對這個數據範圍寫操做都會阻塞,包括insert在這個間隙範圍內的操做,以免幻讀。class
但若是sql語句不走索引全表掃描,此時mysql並不知道數據範圍,mysql只能對全部的數據和間隙上鎖以免幻讀。date
表鎖在InnoDB中應用不多,寫操做是不會加表級別的鎖。select
而DDL語句也會發生阻塞,這個過程是經過使用元數據鎖(Metadata Locks,MDL)來實現的,並非表級別的鎖。 可是能夠用過如下方式加表鎖
可是不建議使用,由於InnoDB的優勢就是行鎖,表鎖性能差。