南寧微信網(wǎng)站制作網(wǎng)頁制作軟件推薦
????????事務一共有四個特性:原子性、隔離性、持久性、一致性。簡稱ACID。本文所將就是其中的隔離性。
1、事務中因為隔離原因?qū)е碌牟l(fā)問題有哪些?
臟讀:當事務A對一個數(shù)據(jù)進行修改,但這個操作還未提交,但此時事務B就已經(jīng)讀取到了這個修改后的數(shù)據(jù),并依據(jù)這個修改后的數(shù)據(jù)進行接下來的操作。這就是臟讀。
不可重復讀:當事務A讀取數(shù)據(jù),然后對這個數(shù)據(jù)進行操作,然后再操作期間事務B對這個數(shù)據(jù)進行了修改,則等事務A再次讀取這個數(shù)據(jù)時,和一開始讀取到的值并不一樣,這就是不可重復讀。
幻讀:幻讀和不可重復讀有點類似,幻讀是事務A對表中所有屬“豬”的人刪掉,而此時事務B對表中查入一條屬“豬”的人的數(shù)據(jù),并進行提交,此時事務A就會以為出現(xiàn)幻覺了,沒有進行刪除操作。
臟讀是對未提交的數(shù)據(jù)的讀取,而不可重復讀和幻讀都是對已提交數(shù)據(jù)的讀取。不可重復讀的重點是修改,幻讀的重點在于新增或者刪除。
2、事務中的隔離級別
-
READ-UNCOMMITTED(讀取未提交): 最低的隔離級別,允許讀取尚未提交的數(shù)據(jù)變更,可能會導致臟讀、幻讀或不可重復讀。
-
READ-COMMITTED(讀取已提交): 允許讀取并發(fā)事務已經(jīng)提交的數(shù)據(jù),可以阻止臟讀,但是幻讀或不可重復讀仍有可能發(fā)生。
-
REPEATABLE-READ(可重復讀): 對同一字段的多次讀取結(jié)果都是一致的,除非數(shù)據(jù)是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發(fā)生。(MySQL默認級別)
-
SERIALIZABLE(可串行化): 最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執(zhí)行,這樣事務之間就完全不可能產(chǎn)生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。
隔離級別 | 臟讀 | 不可重復讀 | 幻影讀 |
---|---|---|---|
READ-UNCOMMITTED | √ | √ | √ |
READ-COMMITTED | × | √ | √ |
REPEATABLE-READ | × | × | √ |
SERIALIZABLE | × | × | × |
3、修改隔離級別
開啟事務:
start transaction;
結(jié)束事務:
commit;? 或者? rollback;
查看隔離級別
select @@transaction_isolation;
修改隔離級別
set session transaction isolation level read committed;? #設置為讀已提交