MySQL事務(wù)是指一組邏輯操作單元,所有邏輯操作單元要么全部成功,要么全部失敗。MySQL支持4種事務(wù)隔離級(jí)別,分別是:讀未提交(read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(serializable)。
# 設(shè)置事務(wù)隔離級(jí)別為可重復(fù)讀 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
1. 讀未提交(read uncommitted)
最低的事務(wù)隔離級(jí)別,是指一個(gè)事務(wù)可以讀取另一個(gè)事務(wù)沒有提交的數(shù)據(jù),也稱為臟讀(dirty read),這種級(jí)別會(huì)造成的問題是,如果一個(gè)事務(wù)正在進(jìn)行當(dāng)中,而另一個(gè)事務(wù)需要對(duì)此數(shù)據(jù)進(jìn)行修改,則會(huì)造成其中一個(gè)事務(wù)的修改被覆蓋, 數(shù)據(jù)不正確。
# 設(shè)置事務(wù)隔離級(jí)別為讀未提交 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
2. 讀提交(read committed)
在這種級(jí)別下,一個(gè)事務(wù)只能讀取另一個(gè)事務(wù)已經(jīng)提交的數(shù)據(jù),可以保證不會(huì)臟讀,但是可能會(huì)出現(xiàn)不可重復(fù)讀的情況。
# 設(shè)置事務(wù)隔離級(jí)別為讀提交 SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
3. 可重復(fù)讀(repeatable read)
在這種級(jí)別下,同一個(gè)事務(wù)在多次讀取同一個(gè)數(shù)據(jù)時(shí),能夠保證數(shù)據(jù)一致性,即數(shù)據(jù)不會(huì)被修改。在這種級(jí)別下,不會(huì)出現(xiàn)臟讀和不可重復(fù)讀,但是可能會(huì)出現(xiàn)幻讀。默認(rèn)的隔離級(jí)別是可重復(fù)讀。
# 設(shè)置事務(wù)隔離級(jí)別為可重復(fù)讀 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
4. 串行化(serializable)
最高的事務(wù)隔離級(jí)別,如果采用這種級(jí)別,會(huì)將所有事務(wù)串行執(zhí)行,避免同時(shí)操作一組數(shù)據(jù)導(dǎo)致的并發(fā)問題。雖然能解決所有的并發(fā)問題,但是會(huì)顯著降低系統(tǒng)并發(fā)能力,不適合高并發(fā)的系統(tǒng)場(chǎng)景。
# 設(shè)置事務(wù)隔離級(jí)別為串行化 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;