MySQL innoDB的事務隔離

2021-09-25 22:58:37 字數 1458 閱讀 2440

關於事務的特性?

acid

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

innodb 中的事務的隔離級別

讀提交: 乙個事物在已提交的時候才可以被其他事務看到

可重複讀: 乙個事務在執行過程中看到的資料,總是跟另個乙個事物在啟動時看到的資料是一致的,只要事務未提交都對其他事務是不可見的。

讀未提交:這個事務還未提交就可以被其他事物所看到的。

疑問: 那讀提交和可重複讀有什麼區別嗎?

是的,我也有這個疑問,讀提交和可重複讀不都是在提交後對其他事務可見。確實是這樣 但是讀提交在另乙個事務提交後再去讀取的值時則會讀取到已提交事務更改的值。而可重複讀是不會的。就算提交了這個事務讀取也是初始讀取到的值。

事務的隔離的實現

事物的隔離性是如何實現的呢?

當乙個事物進行的時候,每一次更改操作都會有乙個回滾記錄,[比如下圖]

graph lr

1update為2-->2update為3

2update為3-->3update為4

3update為4-->當前值4

其中不包括當前值都為回滾段,分別為3個事務,列如可重複讀取當為1的時候,然後可重複讀取的隔離性會將1讀取到 就算1已經update為2 並且comit了。也會拿到出示的資料,如果說這個跟事物時間太長 然後 又來乙個事務這個事物的隔離性是其他型別的,比如可重複讀的就會繼續更改這個值 連續執行了好幾個事務 改了好幾次,但是剛開始執行的事務未提交,所以說他這個回滾檢視是不能被刪除的(刪除條件:當系統裡面沒有整個回滾日誌更早的read——view的時候,這個回滾日誌就會被刪除)做一就會堆積日誌,占用大量的記憶體。(其實我自己也感覺自己寫的這個很難理解很不清楚,所以↓)

~~(在可重複讀的隔離級別下,如何理解**當系統裡沒有比這個回滾日誌更早的 read-view 的時候**,這個回滾日誌就會被刪除?

這也是**盡量不要使用長事務**的主要原因。

比如,在某個時刻(今天上午9:00)開啟了乙個事務a(對於可重複讀隔離級別,此時乙個檢視read-view a也建立了),這是乙個很長的事務……

事務a在今天上午9:20的時候,查詢了乙個記錄r1的乙個欄位f1的值為1……

今天上午9:25的時候,乙個事務b(隨之而來的read-view b)也被開啟了,它更新了r1.f1的值為2(同時也建立了乙個由2到1的回滾日誌),這是乙個短事務,事務隨後就被commit了。

今天上午9:30的時候,乙個事務c(隨之而來的read-view c)也被開啟了,它更新了r1.f1的值為3(同時也建立了乙個由3到2的回滾日誌),這是乙個短事務,事務隨後就被commit了。

……到了下午3:00了,長事務a還沒有commit,為了保證事務在執行期間看到的資料在前後必須是一致的,那些老的事務檢視、回滾日誌就必須存在了,這就占用了大量的儲存空間~~。)~~~~

MySQL InnoDB事務模型

事務的acid特性 原子性 一致性 隔離性 永續性。這部分不多說了,任何一本講資料庫理論的書籍裡邊都會有講。mysql innodb通過鎖來實現事務的一致性和隔離性,共實現了四種事務隔離級別 read uncommitted讀取未提交 某個session中的事務可以看到其他session的事務中尚未...

Mysql Innodb事務的隔離級別

隔離級別 髒讀 dirty read 不可重複讀 nonrepeatable read 幻讀 phantom read 解釋未提交讀 read uncommitted 可能可能 可能事務a執行期間能讀到事務b修改且沒有提交的資料。已提交讀 read committed 不可能可能 可能事務a執行期間...

Mysql InnoDB 事務簡單理解

1.事務基本特性 acid a 由undo 來實現的 i 由鎖實現 d 由redo實現 c 由aid共同保證 2.undo 實現了 事務的回滾 以及 mvcc 事務的回滾 記錄下事務期間的所有update delete insert操作的前後value,當需要rollback時會做乙個相反的操作。m...