日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql k,mysql事务有关概念-怀念K.Dures

發(fā)布時(shí)間:2024/1/23 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql k,mysql事务有关概念-怀念K.Dures 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在最近的項(xiàng)目中由于涉及財(cái)務(wù)轉(zhuǎn)賬所以自然應(yīng)用到mysql的事務(wù)處理,在業(yè)務(wù)邏輯設(shè)計(jì)之初就是在事務(wù)中處理提現(xiàn)的申請記錄以及賬戶余額的凍結(jié),然而在并發(fā)的情況下,會(huì)出現(xiàn)‘臟讀’,看到這個(gè)單詞還是默默的來了一句‘我艸’,想想當(dāng)年du lei si課堂上講transaction已過去4年,還是有點(diǎn)感慨,tmd,學(xué)過的東西終于在現(xiàn)實(shí)當(dāng)中遇到了,可是渣渣我早已忘記怎么解決這種問題,經(jīng)過幾次百度后問題基本解決。僅以此文記錄mysql事務(wù)有關(guān)概念,懷念K.Dures。

在并發(fā)情景下的事務(wù)中,要通過鎖機(jī)制控制并發(fā)帶來的臟讀,不可重復(fù)讀,幻讀的問題;

首先來明確MySQL InnoDB事務(wù)隔離級別

MySQLInnoDB事務(wù)的隔離級別有四級,默認(rèn)是“可重復(fù)讀”(REPEATABLE READ)。

1)未提交讀(READUNCOMMITTED)。另一個(gè)事務(wù)修改了數(shù)據(jù),但尚未提交,而本事務(wù)中的SELECT會(huì)讀到這些未被提交的數(shù)據(jù)(臟讀)(隔離級別最低,并發(fā)性能高)。

2)提交讀(READCOMMITTED)。本事務(wù)讀取到的是最新的數(shù)據(jù)(其他事務(wù)提交后的)。問題是,在同一個(gè)事務(wù)里,前后兩次相同的SELECT會(huì)讀到不同的結(jié)果(不重復(fù)讀)。會(huì)出現(xiàn)不可重復(fù)讀、幻讀問題(鎖定正在讀取的行)

3)可重復(fù)讀(REPEATABLEREAD)。在同一個(gè)事務(wù)里,SELECT的結(jié)果是事務(wù)開始時(shí)時(shí)間點(diǎn)的狀態(tài),因此,同樣的SELECT操作讀到的結(jié)果會(huì)是一致的。但是,會(huì)有幻讀現(xiàn)象(稍后解釋)。會(huì)出幻讀(鎖定所讀取的所有行)。

4)串行化(SERIALIZABLE)。讀操作會(huì)隱式獲取共享鎖,可以保證不同事務(wù)間的互斥(鎖表)。

四個(gè)級別逐漸增強(qiáng),每個(gè)級別解決一個(gè)問題。

1)臟讀:另一個(gè)事務(wù)修改了數(shù)據(jù),但尚未提交,而本事務(wù)中的SELECT會(huì)讀到這些未被提交的數(shù)據(jù)。

首先區(qū)分臟頁和臟數(shù)據(jù)

臟頁是內(nèi)存的緩沖池中已經(jīng)修改的page,未及時(shí)flush到硬盤,但已經(jīng)寫到redo log中。讀取和修改緩沖池的page很正常,可以提高效率,flush即可同步。臟數(shù)據(jù)是指事務(wù)對緩沖池中的行記錄record進(jìn)行了修改,但是還沒提交!!!,如果這時(shí)讀取緩沖池中未提交的行數(shù)據(jù)就叫臟讀,違反了事務(wù)的隔離性。臟讀就是指當(dāng)一個(gè)事務(wù)正在訪問數(shù)據(jù),并且對數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時(shí),另外一個(gè)事務(wù)也訪問這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。

2)不重復(fù)讀 :解決了臟讀后,會(huì)遇到,同一個(gè)事務(wù)執(zhí)行過程中,另外一個(gè)事務(wù)提交了新數(shù)據(jù),因此本事務(wù)先后兩次讀到的數(shù)據(jù)結(jié)果會(huì)不一致。

是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問該同一數(shù)據(jù)。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改,第二個(gè)事務(wù)已經(jīng)提交。那么第一個(gè)事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。例如,一個(gè)編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當(dāng)編輯人員第二次讀取文檔時(shí),文檔已更改。原始讀取不可重復(fù)。如果只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問題

3)幻讀: 解決了不重復(fù)讀,保證了同一個(gè)事務(wù)里,查詢的結(jié)果都是事務(wù)開始時(shí)的狀態(tài)(一致性)。但是,如果另一個(gè)事務(wù)同時(shí)提交了新數(shù)據(jù),本事務(wù)再更新時(shí),就會(huì)“驚奇的”發(fā)現(xiàn)了這些新數(shù)據(jù),貌似之前讀到的數(shù)據(jù)是“鬼影”一樣的幻覺。

是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。例如,一個(gè)編輯人員更改作者提交的文檔,但當(dāng)生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復(fù)本時(shí),發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產(chǎn)部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。

由于項(xiàng)目應(yīng)用Doctrine ORM,通過setLockMode(LockMode::PESSIMISTIC_READ對應(yīng)共享鎖或者LockMode::PESSIMISTIC_WRITE對應(yīng)排它鎖)在查詢中添加加鎖操作。

總結(jié)

以上是生活随笔為你收集整理的mysql k,mysql事务有关概念-怀念K.Dures的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。