《MYSQL數(shù)據(jù)庫Mysql InnoDB的四個事務(wù)隔離級別和(分別逐級解決的問題)臟讀,不可重復(fù)讀,虛讀》要點:
本文介紹了MYSQL數(shù)據(jù)庫Mysql InnoDB的四個事務(wù)隔離級別和(分別逐級解決的問題)臟讀,不可重復(fù)讀,虛讀,希望對您有用。如果有疑問,可以聯(lián)系我們。
MYSQL必讀MySqlInnoDB的事務(wù)隔離級別有四個:(默認(rèn)是可重復(fù)讀repeatable read)
MYSQL必讀未提交讀 read uncommit?: 在另一個事務(wù)修改了數(shù)據(jù),但尚未提交,在本事務(wù)中SELECT語句可能會查詢到這些未被提交的數(shù)據(jù),而發(fā)生臟讀.
MYSQL必讀提交讀 read commit :?在一個事務(wù)中發(fā)生兩次SELECT查詢,當(dāng)?shù)谝淮蜸ELECT執(zhí)行完查詢到一些數(shù)據(jù),接下來另一個事務(wù)修改了這些數(shù)據(jù)并提交了,當(dāng)?shù)诙蜸ELECT執(zhí)行的時候查詢到的數(shù)據(jù)和第一次SELECT的不同,而發(fā)生不可重復(fù)讀、幻讀問題,但解決了臟讀(鎖定所讀取的當(dāng)前行).
MYSQL必讀可重復(fù)讀 repeatable read:在同一個事務(wù)中,SELECT的結(jié)果是事務(wù)開啟時時間點的結(jié)果,因此,同樣的SELECT查詢的結(jié)果總是一致的.解決了不可重復(fù)讀,但有可能發(fā)生虛讀(鎖定所讀取的所有行).
MYSQL必讀串行化 serializable:
MYSQL必讀(轉(zhuǎn)載的)
MYSQL必讀??? 1). 臟讀?
MYSQL必讀????? 首先區(qū)分臟頁和臟數(shù)據(jù)
MYSQL必讀????? 臟頁是內(nèi)存的緩沖池中已經(jīng)修改的page,未及時flush到硬盤,但已經(jīng)寫到redo log中.讀取和修改緩沖池的page很正常,可以提高效率,flush即可同步.臟數(shù)據(jù)是指事務(wù)對緩沖池中的行記錄record進(jìn)行了修改,但是還沒提交!!!,如果這時讀取緩沖池中未提交的行數(shù)據(jù)就叫臟讀,違反了事務(wù)的隔離性.臟讀就是指當(dāng)一個事務(wù)正在訪問數(shù)據(jù),并且對數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時,另外一個事務(wù)也訪問這個數(shù)據(jù),然后使用了這個數(shù)據(jù).
MYSQL必讀??? 2). 不可重復(fù)讀?
MYSQL必讀???? 是指在一個事務(wù)內(nèi),多次讀同一數(shù)據(jù).在這個事務(wù)還沒有結(jié)束時,另外一個事務(wù)也訪問該同一數(shù)據(jù).那么,在第一個事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個事務(wù)的修改,第二個事務(wù)已經(jīng)提交.那么第一個事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的.這樣就發(fā)生了在一個事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀.例如,一個編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔.當(dāng)編輯人員第二次讀取文檔時,文檔已更改.原始讀取不可重復(fù).如果只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問題
MYSQL必讀??? 3). 虛讀 :
MYSQL必讀???? 是指當(dāng)事務(wù)不是獨立執(zhí)行時發(fā)生的一種現(xiàn)象,例如第一個事務(wù)對一個表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行.同時,第二個事務(wù)也修改這個表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù).那么,以后就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣.例如,一個編輯人員更改作者提交的文檔,但當(dāng)生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復(fù)本時,發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中.如果在編輯人員和生產(chǎn)部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題.
事務(wù)A | connection.setAutoCommit(false) | start Transaction | ? |
MYSQL必讀update student set money=money+100 MYSQL必讀from account MYSQL必讀where name='a' |
? | commit(); | ? | insert into account (name,money)values('fff',10000); | ? | ? |
(事務(wù)B) | connection.setAutoCommit(false) | start Transaction |
MYSQL必讀select money from account?where name='a'; MYSQL必讀發(fā)現(xiàn)有1000塊 |
MYSQL必讀? MYSQL必讀? MYSQL必讀? |
MYSQL必讀select money from account?where name='a'; MYSQL必讀發(fā)現(xiàn)有1100 |
? |
MYSQL必讀select money from account where name='a'; MYSQL必讀發(fā)現(xiàn)有1100 |
? | select * from account (查詢結(jié)果包含fff的信息) | commit(); |
說明 | ? | ? | ? | ? | 事務(wù)B讀到了事務(wù)A未提交的數(shù)據(jù),發(fā)生了臟讀 | ? | 事務(wù)A提交后,事務(wù)B前后SELECT查詢money的值不一致,即事務(wù)B讀到了事務(wù)A,update后的數(shù)據(jù),發(fā)生了不可重復(fù)讀 | ? | 虛讀(即一個事務(wù)讀到了另一個事務(wù)insert的數(shù)據(jù)) | ? |
可設(shè)置的事務(wù)級別 | ? | ? | ? | ? | read commit | ? | repeatable read | ? |
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/5026.html