成都房地產(chǎn)網(wǎng)站建設(shè)重慶好的seo平臺
Mysql 中的事務(wù)分為手動提交和自動提交,默認(rèn)是自動提交,所以我們在Mysql每輸入一條語句,其實(shí)就會被封裝成一個事務(wù)提交給Mysql服務(wù)端。
手動提交需要先輸入begin,表示要開始處理事務(wù),然后就是常見的sql語句操作了,操作完畢以后鎖看到的都是臨時處理結(jié)果,最后需要輸入commit才會真正更新到磁盤。
? ? ? ? ? 目錄
1、什么是事務(wù)
2、事務(wù)為什么要有隔離性?
3、隔離級別的分類
(1) 讀未提交(Read Uncommitted)
(2) 讀提交(Read Committed)
(3) 可重復(fù)讀(Repeatable Read)
(4) 串行化(Serializable)
1、什么是事務(wù)
我們在火車站買票,買票和取票的過程可以看做是一個完整的過程(不可能買了票就走人)。但是站在售票員的角度,有人來買票以及取票需要做兩個不同的動作(預(yù)定座位和發(fā)放紙質(zhì)車票)
換到Mysql,我們作為用戶,我們買到票以后取票,這就是一個事務(wù);站在Mysql的角度,事務(wù)不過是多個sql語句的集合,第一條sql語句預(yù)定位置,第二條sql語句查詢并打印車票。
2、事務(wù)為什么要有隔離性?
仍然以買票為例,不同售票窗口雖然服務(wù)的是不同用戶,但是訪問的是同一個數(shù)據(jù)庫,一個窗口剛好在辦理售票業(yè)務(wù),即預(yù)定位置,但是此時突然另一個窗口也要預(yù)定位置,這兩個并發(fā)的業(yè)務(wù)都要預(yù)定位置,但是位置只有一個,但是也不能讓這兩個業(yè)務(wù)同時成功。
因此,事務(wù)具有隔離性的原因是避免并發(fā)帶來的不一致性,為防止兩個事務(wù)相互影響,才有了四種隔離級別。
3、隔離級別的分類
Mysql 下的并發(fā)是不可避免的,不同的場景下對并發(fā)的接受程度也會不一樣,比如買票就不允許兩個人買到同一個座位,但如果是商店購物,兩個人同時要來結(jié)賬,依次處理結(jié)賬事務(wù)是完全可以接受的。
依據(jù)不同的場景,Mysql允許不同程度的并發(fā)干擾,也就是隔離級別,Mysql 下的隔離級別有4種:
- 讀未提交? 【Read Uncommitted】
- 讀提交? ? ? 【Read Committed】
- 可重復(fù)讀? 【Repeatable Read】
- 串行化? ? ?【Serializable】
(1) 讀未提交(Read Uncommitted)
意義:在該隔離級別下,可以看到其他事務(wù)尚未提交的執(zhí)行結(jié)果。
存在的問題:這種情況下其他事務(wù)會受到臨時執(zhí)行結(jié)果的影響,如果線程B讀取到線程A沒有提交的事務(wù),我們稱之為“臟讀”。這種級別相當(dāng)于沒有隔離性,因?yàn)榫€程A在提交事務(wù)之前隨時都可以取消當(dāng)前事務(wù)。
注意:一個事務(wù)在執(zhí)行中,讀到另一個執(zhí)行中事務(wù)的更新(或其他操作)但是未commit的數(shù)據(jù),這種現(xiàn)象叫做臟讀
(2) 讀提交(Read Committed)
意義:該隔離級別是大多數(shù)數(shù)據(jù)庫的隔離級別(不是MySQL默認(rèn)的)。一個事務(wù)可以讀取到其他事務(wù)提交以后的結(jié)果(或者說事務(wù)處理結(jié)束的結(jié)果)
存在的問題:這種情況下存在一定的問題,比如事務(wù)線程B執(zhí)行到某個 if 判斷語句,其他事務(wù)把當(dāng)前 if 語句的判斷條件改變了,這就直接影響到了當(dāng)前事務(wù)的邏輯判斷。我們把這種情況稱為“不可重復(fù)讀”。
(3) 可重復(fù)讀(Repeatable Read)
意義:MySQL默認(rèn)的隔離等級,當(dāng)前正在執(zhí)行的事務(wù)無法看到其他事務(wù)的任何執(zhí)行結(jié)果(無論是臨時還是提交結(jié)果),直至當(dāng)前事務(wù)提交(執(zhí)行結(jié)束)。一定程度上解決了上面讀提交引起的“不可重復(fù)讀”問題。
注意事項(xiàng):其他事務(wù) insert 的數(shù)據(jù)可以被當(dāng)前正在執(zhí)行的事務(wù)讀取到,導(dǎo)致查詢時會多出新的記錄,這種現(xiàn)象叫做“幻讀”,如果出現(xiàn)了幻覺一般。但是MySQL在該級別下是解決了幻讀問題的,采用的方式為 Next-Key 鎖。
(4) 串行化(Serializable)
意義:所有的事務(wù)按照順序依次處理,不會存在并發(fā)問題,但是效率極低。一般不會采用