MySQL鎖之 InnoDB儲存引擎及其鎖機制

2021-07-04 07:52:57 字數 2380 閱讀 9822

首先要解決的乙個誤區就是:innodb儲存引擎是基於事務的。而前面博文所講的myisam儲存引擎是不支援事務的。那麼什麼是基於事務的呢?複製過來一段我覺得講得還不錯的話: 「

在預設的情況下,mysql

從自動提交(

autocommit

)模式執行,這種模式會在每條語句執行完畢後把它作出的修改立刻提交給資料庫並使之永久化。事實上,這相當於把每一條語句都隱含地當做乙個事務來執行。如果你想明確地執行事務,需要禁用自動提交模式並告訴mysql

你想讓它在何時提交或回滾有關的修改。執行事務的常用辦法是發出一條

start transaction

(或begin

)語句掛起自動提交模式,然後執行構成本次事務的各條語句,最後用一條

commit

語句結束事務並把它們作出的修改永久性地記入資料庫。萬一在事務過程中發生錯誤,用一條

rollback

語句撤銷事務並把資料庫恢復到事務開始之前的狀態。

start transaction語句"

掛起"自動提交模式的含義是:在事務被提交或回滾之後,該模式將恢復到開始本次事務的

start transaction

語句被執行之前的狀態。(如果自動提交模式原來是啟用的,結束事務將讓你回到自動提交模式;如果它原來是禁用的,結束當前事務將開始下乙個事務。)如果是autocommit模式,

autocommit

的值應該為

1;請在試驗前

確定autocommit 

的模式是否開啟。

」1、事務及其acid屬性

原子性,隔離性,永續性,一致性

2、併發事務處理帶來的問題

更新丟失:乙個事物覆蓋了另乙個事務的更新

髒讀:乙個事物讀到了另乙個事務未提交的資料。

不可重複讀:乙個事物的兩次讀期間,另乙個事務改變了值

幻讀:乙個事物兩次讀期間,另乙個事務插入新的資料。

3、事物的隔離級別

髒讀,不可重複讀,幻讀都是資料庫讀一致性問題,必須由資料庫提供一種事務隔離機制來解決。資料庫實現事務隔離的方式,有兩種:

一種是在讀取資料前,對其加鎖,阻止其他事務對資料進行修改。

一種是不加鎖,通過生成乙個資料請求時間點的一致性資料快照,並用這個快照來提供一定級別的一致性讀取。這種技術叫做資料多版本併發控制,也經常成為多版本資料庫(mvcc)

未提交讀,已提交讀,可重複讀,可序列化

4、innodb的行鎖模式及其加鎖方法

innodb中有以下兩種型別的行鎖:共享鎖和排他鎖。

對於update,insert,delete語句,innodb會自動給設計的資料集加排他鎖。對於普通的select語句,innodb不會加任何鎖。

事物可以通過以下語句顯示給記錄集加共享鎖和排他鎖。

共享鎖:select * from 。。。。。 lock in share mode

排它鎖:select * from .......... for update

5、innodb行鎖的實現方式

innodb行鎖是通過給索引上的索引項加鎖來實現的,如果沒有索引,innodb將通過隱藏的聚簇索引來對記錄加鎖。innodb這種行鎖實現特點意味著:如果不通過索引條件檢索資料,那麼innodb將對錶中的所有記錄加鎖,實際效果跟表鎖一樣。

(1)在不通過索引條件查詢時,innodb會鎖定表中的所有記錄。

(2)mysql的行鎖是針對索引加的鎖,不是針對記錄加的鎖,所以雖然是訪問不同行的記錄,但是如果使用相同的索引鍵,是會出現衝突的。

(3)當表有多個索引的時候,不同的事務可以使用不同的索引鎖定不同的行,但都是通過行鎖來對資料加鎖。

(4)next-key鎖(間隙鎖)

可以防止幻讀和滿足恢復和複製的需要

MySql儲存引擎InnoDB的鎖

innodb實現了以下兩種型別的行鎖 共享鎖 s 允許乙個事務去讀一行,阻止其他事務獲得相同的資料集的排他鎖。排他鎖 x 允許獲得排他鎖的事務更新資料,阻止其他事務獲得相同資料集的共享鎖和排他鎖。共享鎖就是我讀的時候,你可以讀,但是不能寫。排他鎖就是我寫的時候,你不能讀也不能寫。另外,為了允許行鎖和...

MySQL之InnoDB鎖機制

innodb儲存引擎實現了如下兩種標準的行級鎖 共享鎖 s lock 允許事務讀一行資料。排他鎖 x lock 允許事務刪除或更新一行資料。如果乙個事務 t1 已經獲得了行 r 的共享鎖,那麼另外的事務 t2 可以立即獲得行 r 的共享鎖,因為讀取並沒有改變行 r 的資料,稱這種情況為鎖相容。但若有...

mysql主流Innodb儲存引擎 事務鎖分析

repeatable read 可重讀 mysql中innodb預設的隔離級別。悲觀鎖 為了防止併發導致資料庫操作受其他執行緒運算元據庫影響,一般基於資料庫的悲觀鎖來加鎖操作。從sql語句來看,為了搶占獨佔鎖,兩種方式。1 更新語句加鎖 begin 開啟事務 insert into a.update...