日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解MySQL事務的四大特性和隔離級別

1、事務的四大特性(ACID)
1.1、原子性(Atomicity) 原子性是指事務包含的一系列操作要么全部成功,要么全部回滾,不存在部分成功或者部分回滾,是一個不可分割的操作整體。
1.2、一致性(Consistency)
一致性是可以理解為事務對數(shù)據(jù)完整性約束的遵循,這些約束可能包括主鍵約束、唯一索引約束、外鍵約束等等。事務執(zhí)行前后,數(shù)據(jù)都是合法的狀態(tài),不會違背任何的數(shù)據(jù)完整性
就拿轉(zhuǎn)賬來說,A和B加起來有5000塊錢,不管A和B如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,A和B加起來的錢永遠都是5000塊。
總之,可以理解為:一致性是為了保證數(shù)據(jù)的完整性。
1.3、隔離性(Isolation)
隔離性是指當多個用戶并發(fā)操作數(shù)據(jù)庫,比如操作同一張表,數(shù)據(jù)庫為每一個用戶開啟的事務,不能被其他的事務所干擾或者影響,事務之間是彼此獨立的。
1.4、永久性(Durability)
永久性是指一個事務一旦提交了,那么對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久的,即使是在數(shù)據(jù)庫發(fā)生故障時,也不會丟失事務提交的數(shù)據(jù)。
2、事務的隔離性
事務的隔離性。當多個線程開啟事務操作數(shù)據(jù)庫中的數(shù)據(jù)時,數(shù)據(jù)庫要能進行隔離操作,以保證各個線程獲取數(shù)據(jù)的準確性; 如果不考慮事務的隔離性,會發(fā)生以下幾個問題;

創(chuàng)新互聯(lián)10多年成都定制網(wǎng)頁設計服務;為您提供網(wǎng)站建設,網(wǎng)站制作,網(wǎng)頁設計及高端網(wǎng)站定制服務,成都定制網(wǎng)頁設計及推廣,對成都假山制作等多個方面擁有豐富的網(wǎng)站制作經(jīng)驗的網(wǎng)站建設公司。

2.1、臟讀
臟讀是指一個事務在處理過程中讀取了另一個事務未提交的數(shù)據(jù)。比如,A向B轉(zhuǎn)賬

 
 
 
 
  1. update account set money = money + 100 where name = 'B'; 
  2. update account set money = money - 100 where name = 'A'  

當只執(zhí)行第一條SQL時,A通知B查看賬戶,B發(fā)現(xiàn)確實錢已到賬(此時即發(fā)生了臟讀),
而之后無論第二條SQL是否執(zhí)行,只要該事務不提交,則所有操作都將回滾,那么當B以后再次查看賬戶時就會發(fā)現(xiàn)錢其實并沒有轉(zhuǎn)

2.2、不可重復讀
不可重復讀是指在對于數(shù)據(jù)庫中的某個數(shù)據(jù),一個事務范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔,被另一個事務修改并提交了。例如事務T1在讀取某一數(shù)據(jù),而事務T2立馬修改了這個數(shù)據(jù)并且提交事務給數(shù)據(jù)庫,事務T1再次讀取該數(shù)據(jù)就得到了不同的結(jié)果,發(fā)生了不可重復讀。不可重復讀和臟讀的區(qū)別是,臟讀是某一事務讀取了另一個事務未提交的臟數(shù)據(jù),而不可重復讀則是讀取了前一事務提交的數(shù)據(jù)。在某些情況下,不可重復讀并不是問題,比如我們多次查詢某個數(shù)據(jù)當然以最后查詢得到的結(jié)果為主。但在另一些情況下就有可能發(fā)生問題,例如對于同一個數(shù)據(jù)A和B依次查詢就可能不同,A和B就可能打起來了……
2.3、幻讀
幻讀是事務非獨立執(zhí)行時發(fā)生的一種現(xiàn)象。
例如事務T1對一個表中所有的行的某個數(shù)據(jù)項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行數(shù)據(jù)項,而這個數(shù)據(jù)項的數(shù)值還是為“1”并且提交給數(shù)據(jù)庫。而操作事務T1的用戶如果再查看剛剛修改的數(shù)據(jù),會發(fā)現(xiàn)還有一行沒有修改,其實這行是從事務T2中添加的,就好像產(chǎn)生幻覺一樣,這就是發(fā)生了幻讀。
幻讀和不可重復讀都是讀取了另一條已經(jīng)提交的事務(這點就臟讀不同),所不同的是不可重復讀查詢的都是同一個數(shù)據(jù)項,而幻讀針對的是一批數(shù)據(jù)整體(比如數(shù)據(jù)的個數(shù))
3、MySQL的隔離級別
Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發(fā)生 > * Repeatable read (可重復讀):可避免臟讀、不可重復讀的發(fā)生 > * Read committed (讀已提交):可避免臟讀的發(fā)生 > * Read uncommitted (讀未提交):最低級別,任何情況都無法保證
以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執(zhí)行效率就越低。
像Serializable這樣的級別,就是以鎖表的方式(類似于Java多線程中的鎖)使得其他的線程只能在鎖外等待)
所以平時選用何種隔離級別應該根據(jù)實際情況。

3.1、MySQL和Oracle隔離級別的對比
MySQL支持以上4種隔離級別,默認的隔離級別是Repeatable read (可重復讀)
Oracle只支持Serializable (串行化)級別和Read committed (讀已提交)這兩種級別,默認的隔離級別是Read committed (讀已提交)
查看mysql事務的隔離級別

 
 
 
 
  1. select @@tx_isolation 

4、舉例說明事務的隔離級別
4.1、Repeatable read (可重復讀)
開啟兩個事務A、B,分別對同一個表中的數(shù)據(jù)進行操作,操作流程如下:

結(jié)果:在Repeatable read的隔離級別下,T4得到的結(jié)果仍然是Tom:

此時,如果將事務A提交之后,再查詢,得到的將是最新的結(jié)果:

4.2、Read committed (讀已提交)
現(xiàn)在看看將隔離級別設置為讀已提交,返回的結(jié)果又是什么

 
 
 
 
  1. set session transaction isolation level read committed 

注意:此種修改只對當前會話有效,如果要全局修改隔離級別,需要到mysql安裝目錄下的my.ini最后添加

 
 
 
 
  1. transaction-isolation = REPEATABLE-READ 

結(jié)果:在Read committed的隔離級別下,T4得到的結(jié)果就是最新,說明讀到了已提交的:


當前名稱:詳解MySQL事務的四大特性和隔離級別
當前網(wǎng)址:http://m.5511xx.com/article/dpchohi.html