Mysql.lock

#mysql鎖mysql

##行鎖爭奪sql

show status like 'innodb_row_lock%';

InnoDB的行鎖模式及加鎖方法

  • innoDB實現瞭如下兩種類型的行鎖。
  1. 鎖(S):容許一個事務去讀一行,阻止其餘事務得到相同數據集的排他鎖。
  2. 鎖(X):容許得到排他鎖的事務更新數據,阻止其餘事務取得相同數據集的共享讀鎖和排他寫鎖。 另外,爲了容許行鎖和表鎖共存,實現多粒度鎖機制,InnoDB還有兩種內部使用的意向鎖(Intention Locks),這兩種意向鎖都是表鎖。
  3. 共享鎖(IS):事務打算給數據行加行共享鎖,事務在給一個數據行加共享鎖前必須先取得該表的IS鎖。
  4. 排他鎖(IX):事務打算給數據行加行排他鎖,事務在給一個數據行加排他鎖前必須先取得該表的IX鎖。
  • 若是一個事務請求的鎖模式與當前的鎖兼容,InnoDB就將請求的鎖授予該事務;反之,若是二者不兼容,該事務就要等待鎖釋放。 意向鎖是InnoDB自動加的,不需用戶干預。對於UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及數據集加排他鎖(X);對於普通SELECT語句,InnoDB不會加任何鎖;
#共享鎖
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
#排他鎖
SELECT * FROM table_name WHERE ... FOR UPDATE
  • 用SELECT ... IN SHARE MODE得到共享鎖,主要用在須要數據依存關係時來確認某行記錄是否存在,並確保沒有人對這個記錄進行UPDATE或者DELETE操做。可是若是當前事務也須要對該記錄進行更新操做,則頗有可能形成死鎖,對於鎖定行記錄後須要進行更新操做的應用,應該使用SELECT... FOR UPDATE方式得到排他鎖。

##InnoDB行鎖實現方式數據庫

  • noDB行鎖是經過給索引上的索引項加鎖來實現的,這一點MySQL與Oracle不一樣,後者是經過在數據塊中對相應數據行加鎖來實現的。InnoDB這種行鎖實現特色意味着:只有經過索引條件檢索數據,InnoDB才使用行級鎖,不然,InnoDB將使用表鎖!
  • MySQL的行鎖是針對索引加的鎖,不是針對記錄加的鎖,因此雖然是訪問不一樣行的記錄,可是若是是使用相同的索引鍵,是會出現鎖衝突
#關閉自動提交,2個session,查詢2行,也會衝突,第二條查詢會等待
select * from table where id = 1 for update;
select * from table where id = 2 for update;

##間隙鎖(Next-Key鎖)session

  • 們用範圍條件而不是相等條件檢索數據,並請求共享或排他鎖時,InnoDB會給符合條件的已有數據記錄的索引項加鎖;對於鍵值在條件範圍內但並不存在的記錄,叫作「間隙(GAP)」,InnoDB也會對這個「間隙」加鎖,這種鎖機制就是所謂的間隙鎖(Next-Key鎖)。 舉例來講,假如emp表中只有101條記錄,其empid的值分別是 1,2,...,100,101,下面的SQL:
Select * from  emp where empid > 100 for update;

事務

select 默認是共享鎖code

#查看自動提交0手動,1自動
select @autocommit
#手動設置是否自動
set autocommit;
#提交
commit;
#查看mysql版本
SELECT @@version;
#查看當前事務隔離級別
select @@tx_isolation;
#全局事務隔離級別
select @@global.tx_isolation;
#設置事務隔離級別,也用經過mysql.ini設置
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
#查看當前正在運行的查詢 或者等待休眠中的查詢
show processlist;
#mysql5.5以後,information_schema數據庫加了三個關於鎖的表。
#innodb_trx ## 當前運行的全部事務
#innodb_locks ## 當前出現的鎖
#innodb_lock_waits ## 鎖等待的對應關係
#查看innodb引擎狀態,鎖,事務,各類信息
show engine innodb status
#查看鎖等待時間,設置my.ini innodb_lock_wait_timeout值
SELECT @@innodb_lock_wait_timeout;
相關文章
相關標籤/搜索