MySQL 共享鎖 互斥鎖 意向鎖。

2021-10-01 12:10:14 字數 1070 閱讀 7265

經常聽到資料庫的鎖機制,不同的資料庫的不同實現不同, 聽多了就頭疼了,今天就把mysql的鎖整的明明白白:

首先想一下為什麼我們會需要鎖,其實就是為了解決併發運算元據的,是一種控制併發的機制。

樂觀鎖和悲觀鎖其實是兩種思想,用來指導實現鎖的功能的不同實現思想,

在這兩種指導思想下產生了對應的鎖:

我們可以對一行資料建立乙個字段專門用來存放對這行資料操作時的時間戳,比如我們第一次讀取的時候拿到時間戳 timestamep=111,a=2, id =1 ,然後提交a=3更新的時候,我們的update  tablename set a = 3  where id =1 timestamp=111 失敗,說明這條資料被別的事務操作了。

樂觀鎖是一種軟併發控制,需要你設定好完整的邏輯處理。

悲觀鎖也就是我們經常說的鎖的概念,包括什麼共享鎖,互斥鎖,讀鎖,寫鎖,意向共享鎖,意向互斥鎖,共享鎖和讀鎖是乙個概念,互斥鎖和寫鎖乙個概念,以此類推 意向共享鎖也可以叫意向讀鎖, 意向互斥鎖也可以叫意向寫鎖。

這些鎖的使用使用在**是有鎖的使用範圍的,也就是每種鎖的粒度。mysql的鎖的粒度和引擎相關,我們今天就著重介紹一下innodb,因為這個是5.5.8版本以後的預設版本。

注意:mysql的引擎是表級別的,就是在建立表的時候指定,也就是說你乙個資料庫的不同表你可以指定不同引擎

意向鎖其實不會阻塞全表掃瞄之外的任何請求,它們的主要目的是為了表示是否有人請求鎖定表中的某一行資料。

有的人可能會對意向鎖的目的並不是完全的理解,我們在這裡可以舉乙個例子:如果沒有意向鎖,當已經有人使用行鎖對錶中的某一行進行修改時,如果另外乙個請求要對全表進行修改,那麼就需要對所有的行是否被鎖定進行掃瞄,在這種情況下,效率是非常低的;不過,在引入意向鎖之後,當有人使用行鎖對錶中的某一行進行修改之前,會先為表新增意向互斥鎖(ix),再為行記錄新增互斥鎖(x),在這時如果有人嘗試對全表進行修改就不需要判斷表中的每一行資料是否被加鎖了,只需要通過等待意向互斥鎖被釋放就可以了。

各種鎖之間的約束關係:

mysql共享鎖 排他鎖 意向鎖

mysql鎖機制分為表鎖和行鎖,其中行鎖又包括了共享鎖與排他鎖。又稱為讀鎖 s鎖 當有多個事務時,多個事務對於同一資料可以共享乙個鎖,都能訪問到資料,但是其他事務只能讀不能寫。又稱為寫鎖 x鎖 當有多個事務時,排他鎖不能與其他鎖並存,乙個事務獲取了一行資料的排他鎖,其他事務就不能再獲取該行的其他鎖,...

意向鎖的作用

在了解innodb事務併發控制的時候,裡面提到了意向鎖 intention lock 這裡簡單做下總結 在innodb的使用場景中,裡面有實現了行鎖,具體有對行的讀鎖,寫鎖。另外,如果對乙個表作一些統一的操作,表的層面,有表層級的讀鎖,寫鎖。那這個意向鎖是幹嘛用的?我們假設乙個場景,乙個事務a正在寫...

mysql意向鎖的概念和用途

鎖的粒度 a.表鎖 table lock 對整個表加鎖,影響標準的所有記錄。通常用在ddl語句中,如delete table,alter table等。b.行鎖 row lock 對一行記錄加鎖,只影響一條記錄。通常用在dml語句中,如insert,update,delete等。很明顯,表鎖影響整個...