事務隔離級別概述
mysql中,innodb所提供的事務符合ACID的要求,而事務通過事務日志中的redo log和undo log滿足了原子性、一致性、持久性,事務還會通過鎖機制滿足隔離性,在innodb存盤引擎中,有不同的隔離級別,他們有不同的隔離性,
不同隔離級別所擁有的問題
| 臟讀 | 不可重讀 | 幻讀 | |
|---|---|---|---|
| 讀未提交 | ?? | ?? | ?? |
| 讀提交 | ? | ?? | ?? |
| 可重讀 | ? | ? | ?? |
| 串行化 | ? | ? | ? |
幾種隔離級別的解釋
- 讀未提交:未提交的也能讀到
一個事務A并未提交,但另一個事務B可以看到事務A所做的修改,
兩個事務A,B,如果是讀未提交隔離級別,事務A所做的修改并未提交,事務B也能讀到其所做的修改,這也解釋了為什么讀未提交隔離級別會存在臟讀、不可重讀、幻讀的情況,
臟讀:如果事務A修改了一條記錄,事務B讀到了修改后的資料,結果事務A撤銷了事務,那事務B讀到的就是臟資料,不準的資料,
不可重讀:如果事務A修改了一條記錄,事務B讀到了修改后的資料,事務A撤銷了事務,事務B再次讀取此條記錄,發現兩次讀取的資料不一致,造成不可重讀,
幻讀:事務A執行添加陳述句,添加一條記錄,事務B讀取資料時,發現新增了一條記錄;事務A撤銷事務,洗掉掉新增記錄,事務B再次讀取,發現新增資料沒有了,感覺像出現幻覺一樣,
2.讀提交:提交后才能讀到
一個事務A并未提交,另一個事務B不能看到事務A所做的修改,事務B只能讀到事務A提交后的更改,這種隔離級別叫做讀提交,
為什么讀提交會發生不可重讀和幻讀?
不可重讀:事務A修改了一條記錄,未提交時,事務B讀到此條記錄沒有修改,事務A提交后,事務B再讀時,此條記錄已經修改,
幻讀:事務A向表插入一條記錄,此時事務B查詢是查不到的,事務A提交,此時事務B再查,查到了插入的記錄,出現幻讀,
3.可重讀:MySQL默認的事務級別,事務A修改了資料表記錄,事務B查看到的資料仍然是事務A修改前的資料,即使事務A提交了,在事務B沒有提交之前,事務B中查看到的資料都是相同的,不管事務A是否提交,在事務B沒有提交之前,這條資料對于事務B來說一直沒有發生改變,這條資料在事務B中可以重復的被讀到,所以,這種隔離級別被稱為可重讀,
為什么可重讀會出現幻讀?
幻讀:事務A添加了一條記錄,然后提交了,事務B因為沒有提交,不管怎么查,都查不到新增記錄,事務B一提交,再查詢時發現資料多了一條,出現幻讀,
臟讀、幻讀、不可重讀的區別
臟讀:當前事務可以查看到別的事務未提交的資料(側重點在別的事務未提交)
幻讀:幻讀與不可重讀很容易混淆,幻讀側重于新增和洗掉,表示在同一個事務中,使用相同的查詢陳述句,第二次查詢時,莫名的多出了一些以前不存在的資料,或者莫名的不見了一些資料,
不可重讀:不可重讀的側重點在更新修改資料,表示在同一個事務中,查詢相同的資料范圍時,同一個資料資源莫名的改變了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/259796.html
標籤:其他
上一篇:MySQL視圖
下一篇:pwn新手初接觸
