mysql如何實現隔離性 Mysql的隔離以及實現

2021-10-17 20:27:29 字數 914 閱讀 3256

mysql的隔離級別有四個

1、讀未提交

2、讀提交

3、可重複讀 rr

4、序列讀

隔離的實現

每次修改對應乙個事務id:row trx id,還對應乙個undo log,因此undo log和row trx id是一一對應的。

當我們開始乙個事務的時候,會生成乙個事務的snap shot,將當前正在進行的沒有提交的事務id存放到乙個陣列中。這個陣列是靜態的,可稱之為檢視。致性innodb就是用這個陣列來實現隔離的,從而保證了一致性讀。

陣列中最大的id是自己,表示高水位;最小的是事務id是低水位。

對於可重複讀,小於低水位的資料說明在建立事務之前就已經提交,因此對於本事務是可見的;

大於高水位的資料是不可見的,是本次事務建立後才建立的事務修改的資料,因此對於本事務是不可見的;

如果處於低水位和高水位之前的事務修改的資料,則要看該事務id是否落在了檢視建立是的事務陣列中,如果落在了裡面,表示雖然該事務早於我之前建立,但是晚於我事務啟動時提交,因此是不可見的。如果沒有落在事務id陣列中,那麼表示本事務建立時,該事務已經提交,因此是可見的。

以上幾個原則,保證了一致性讀。

更新操作的可見性

資料更新時,必須是在當前的最新的資料上修改,否則某些事務的更新就會被覆蓋。因此,事務中的更新操作必須是當前讀。這就和我們上面說的一致性讀產生了矛盾,或者說是有別於一致性讀。此時就要引入行鎖,當資料修改,但沒有提交時,行鎖是一直持有的。因此其他事務的更新操作是會被阻塞的。因此,行鎖保證了當前讀,也就保證了資料的修改不會被覆蓋。

mysql 隔離性與隔離級別

提到事務,你肯定不陌生,和資料庫打交道的時候,我們總是會用到事務。最經典的例子就是轉賬,你要給朋友小王轉 100 塊錢,而此時你的銀行卡只有 100 塊錢。轉賬過程具體到程式裡會有一系列的操作,比如查詢餘額 做加減法 更新餘額等,這些操作必須保證是一體的,不然等程式查完之後,還沒做減法之前,你這 1...

Mysql 事務隔離性

事務併發所引起的跟讀取資料有關的問題,各用一句話來描述一下 1.髒讀 事務 a 讀取了事務 b 未提交的資料,並在這個基礎上又做了其他操作。讀取未提交 2.不可重複讀 事務 a 讀取了事務 b 已提交的更改資料。讀取新提交update 3.幻讀 事務 a 受到事務 b 已提交的新增資料影響。看不到已...

MySQL事務的隔離性

事務的特徵 acid 隔離級別 設定事務隔離級別 隔離級別的作用範圍 檢視事務隔離級別 事務的操作 隔離級別 髒讀不可重複讀 幻讀讀未提交 read uncommitted 可能可能 可能讀已提交 read committed 不可能可能 可能可重複讀 repeatable read 不可能不可能 ...