Mysql 共享鎖(lock in share mode),排他鎖(for update)

共享鎖(lock in share mode)

簡介

容許不一樣事務以前共享加鎖讀取,但不容許其它事務修改或者加入排他鎖
若是有修改必須等待一個事務提交完成,才能夠執行,容易出現死鎖mysql

共享鎖事務之間的讀取

session1:sql

start transaction;
select * from test where id = 1 lock in share mode;

session2:session

start transaction;
select * from test where id = 1 lock in share mode;

<!--more-->併發

此時session1和session2均可以正常獲取結果,那麼再加入session3 排他鎖讀取嘗試rest

session3:code

start transaction;
select * from test where id = 1 for update;

在session3中則沒法獲取數據,直到超時或其它事物commit事務

Lock wait timeout exceeded; try restarting transaction

共享鎖之間的更新

當session1執行了修改語句:
session1:get

update test set name = 'kkkk' where id = 1;

能夠不少獲取執行結果。
當session2再次執行修改id=1的語句時:
session2:it

update test set name = 'zzz' where id = 1;

就會出現死鎖或者鎖超時,錯誤以下:io

Deadlock found when trying to get lock; try restarting transaction

或者:

Lock wait timeout exceeded; try restarting transaction

必須等到session1完成commit動做後,session2纔會正常執行,若是此時多個session併發執行,可想而知出現死鎖的概率將會大增。

session3則更不可能

結論:

mysql共享鎖(lock in share mode)

  • 容許其它事務也增長共享鎖讀取
  • 不容許其它事物增長排他鎖(for update)
  • 當事務同時增長共享鎖時候,事務的更新必須等待先執行的事務commit後才行,若是同時併發太大可能很容易形成死鎖

共享鎖,事務都加,都能讀。修改是唯一的,必須等待前一個事務commit,纔可

排他鎖(for update)

簡介

當一個事物加入排他鎖後,不容許其餘事務加共享鎖或者排它鎖讀取,更加不容許其餘事務修改加鎖的行。

排他鎖不一樣事務之間的讀取

一樣以不一樣的session來舉例
session1:

start transaction;
select * from test where id = 1 for update;

session2:

start transaction;
select * from test where id = 1 for update;

當session1執行完成後,再次執行session2,此時session2也會卡住,沒法馬上獲取查詢的數據。直到出現超時

Lock wait timeout exceeded; try restarting transaction

或session1 commit纔會執行

那麼再使用session3 加入共享鎖嘗試

select * from test where id = 1 lock in share mode;

結果也是如此,和session2同樣,超時或等待session1 commit

Lock wait timeout exceeded; try restarting transaction

排他鎖事務之間的修改

當在session1中執行update語句:

update test set name = 123 where id = 1;

能夠正常獲取結果

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

此時在session2中執行修改

update test set name = 's2' where id = 1;

則會卡住直接超時或session1 commit,纔會正常吐出結果

session3也很明顯和session2同樣的結果,這裏就很少贅述

總結

  • 事務之間不容許其它排他鎖或共享鎖讀取,修改更不可能
  • 一次只能有一個排他鎖執行commit以後,其它事務纔可執行

不容許其它事務增長共享或排他鎖讀取。修改是唯一的,必須等待前一個事務commit,纔可

相關文章
相關標籤/搜索