mysql事務隔離級別

2022-03-07 14:13:48 字數 1471 閱讀 9183

mysql的鎖

1. 共享鎖,也就是讀鎖,可以通過select ... lock in share mode強制加鎖,預設select語句是不加鎖的

2. 排他鎖,也就是寫鎖,可以通過select ... for update強制加寫鎖,預設情況下insert, update, delete語句加寫鎖

mysql鎖的粒度

1. 行鎖,鎖一行,併發高(因為衝突少),開銷小,會產生死鎖,innodb引擎

2. 表鎖,鎖全表,併發低(因為衝突多),開銷大,不會產生死鎖,myisam, memory引擎,所以myisam沒有事務,也是不會資料庫死鎖的,在執行sql前做一次鎖定好所需資源,但是myisam可能會因為大量的表級別的寫鎖導致無法獲取到讀鎖從而對讀阻塞

3. 頁鎖,對杭鎖和表鎖的一種折中,鎖一批相鄰的記錄,在併發和開銷上介於行級鎖和表鎖中間,也會產生死鎖,bdb資料庫

innodb儲存引擎

由於innodb有mvcc,所以select ...的時候是不加鎖的,直接讀最新版本的資料

select語句強制指定鎖的時候回加鎖,還有就是insert, update, delete的時候要加鎖

事務隔離級別

事務隔離級別可以理解為描述了多個事務同時發生時候對資料的鎖定級別,這是在併發能力和交叉事務上表現的一種折中,在標準sql中一共有四種事務隔離界別

四個隔離級別有兩個工程中幾乎不用

read uncommited,未提交讀

從名字上記憶就是,事務還沒提交,其他事務中就觀測到了資料的修改,沒人想用這個,針對別人還沒提交就讀取到的這種現象叫做髒讀

serialiazble,序列化

讀寫是衝突的,所以變成了序列,沒有併發,這個也沒人用

還有兩個隔離級別,是常用的

read commited,提交讀,簡稱rc隔離級別

這個級別解決了read uncommited髒讀的問題,對讀取的資料加讀鎖,讀完立刻釋放,對寫的資料加寫鎖,直到事務結束寫鎖才釋放。這樣就不會產生髒讀。但是會產生一次事務內寫鎖加鎖前讀取兩次讀取資料不一致的情況,這種不一致情況叫做不可重複讀

repeatable read,可重複讀,簡稱rr隔離級別(mysql預設的事務隔離級別)

這個級別解決了read commited兩次讀取資料可能不一致的問題,解決的方法就是讀加讀鎖,直到事務結束才釋放,寫加寫鎖,直到事務結束才釋放。這樣就不會產生兩次讀的資料不一致,因為讀鎖的釋放時間增加了,保證了在讀的時候是不可以有人來改變資料的。

如果是通過簡單的行級鎖的機制來實現rr隔離級別,那麼在資料插入的時候會產生問題,比如事務1做乙個範圍查詢,但是事務2在這個事務內插入了一條資料,並提交,事務1再做範圍查詢的時候回查詢到事務2新增的資料,這個也是一種兩次讀取資料不一致的情況,但是這個不叫不可重複讀,叫做幻讀。

mysql在rr隔離級別下可以通過gap鎖來解決幻讀,也就是加行鎖的時候不是只對某一行加鎖,而是根據索引,把相鄰的索引區間加鎖,這樣在相鄰區間上進行insert的時候,需要等待,這種gap區間的大小也有可能最後變成鎖全表

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

MySQL事務隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...

Mysql 事務隔離級別

mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...