真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法

這篇文章主要介紹“MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法”,在日常操作中,相信很多人在MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出尼木免費(fèi)做網(wǎng)站回饋大家。

MySQL事務(wù)

    事務(wù)的特性ACID,分別表示原子性(atomicity)、一致性(consistency)、隔離性(isolation)、和持久性(durability)。一個(gè)運(yùn)行良好的事務(wù)處理系統(tǒng),必須具備這些標(biāo)準(zhǔn)特性。

    1. 原子性(atomicity)
    一個(gè)事務(wù)必須被視為一個(gè)不可分割的最小工作單元,整個(gè)事務(wù)中所有操作要么全部提交成功,要么全部失敗回滾,對(duì)于一個(gè)事務(wù)來講,不可能只執(zhí)行其中的一部分操作,這就是事務(wù)的原子性。

    2. 一致性(consistency)
    數(shù)據(jù)庫總是從一個(gè)一致性的狀態(tài)轉(zhuǎn)換到另一個(gè)一致性的狀態(tài)。

    3. 隔離性(isolation)
    通常來說,一個(gè)事務(wù)所做的修改在最終提交以前,對(duì)其他事務(wù)是不可見的。

    4. 持久性(durability)
     一旦事務(wù)提交,則其所做的修改就會(huì)永久的保存到數(shù)據(jù)庫中。此時(shí)即使系統(tǒng)崩潰,修改的數(shù)據(jù)也不會(huì)丟失。

隔離級(jí)別

    隔離性其實(shí)比想象中的要復(fù)雜。在SQL標(biāo)準(zhǔn)中定義了四種隔離級(jí)別,每一種隔離級(jí)別都規(guī)定了一個(gè)事務(wù)中所做的修改,哪些在事務(wù)內(nèi)或事務(wù)間是可見的,哪些是不可見的。較低級(jí)別的隔離通常可以執(zhí)行更高的并發(fā),系統(tǒng)開銷也低。

READ UNCOMMITTED(未提交讀)
    在 READ UNCOMMITTED 級(jí)別,事務(wù)中修改,即使沒提交,對(duì)其他事務(wù)也都是可見的。事務(wù)可以讀取未提交的數(shù)據(jù),這也被稱為臟讀。這個(gè)級(jí)別會(huì)導(dǎo)致很多問題,從性能上來說 READ UNCOMMITTED 不會(huì)比其他的級(jí)別好太多,但卻缺乏其他級(jí)別的很多好處,除非真的有非常必要的理由,在實(shí)際應(yīng)用中一般很少使用。

READ COMMITTED(提交讀)
    大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級(jí)別都是 READ COMMITTED (但MySQL不是)。READ COMMITTED滿足前面提到的隔離性的簡單定義:一個(gè)事務(wù)開始時(shí),只能“看見”已經(jīng)提交的事務(wù)所做的修改。換句話說,一個(gè)事務(wù)從開始直到提交之前,所做的任何修改對(duì)其他事務(wù)都是不可見的。這個(gè)級(jí)別有時(shí)候也叫做不可重復(fù)讀(nonrepeatable read),因?yàn)閮纱螆?zhí)行同樣的查詢,可能會(huì)得到不一樣的結(jié)果。

REPEATABLEB READ(可重復(fù)度)
    REPEATABLEB READ解決了臟讀的問題。該級(jí)別保證了在同一個(gè)事務(wù)中多次讀取同樣記錄的結(jié)果是一致的。但是理論上,可重復(fù)讀隔離級(jí)別還是無法解決另外一個(gè)幻讀(Phantom Read)的問題。所謂幻讀,指的是當(dāng)某個(gè)事務(wù)在讀群某個(gè)范圍內(nèi)的紀(jì)錄時(shí),另外一個(gè)事務(wù)又在該范圍內(nèi)插入了新的記錄,當(dāng)之前的事務(wù)再次讀取該范圍的紀(jì)錄時(shí),會(huì)產(chǎn)生幻行(Phantom Row)。InnoDB和XtraDB存儲(chǔ)引擎通過多版本并發(fā)控制器(MVCC,Multiversion Concurrency Control)解決了幻讀的問題。可重復(fù)讀是MySQL的默認(rèn)事務(wù)隔離級(jí)別。

SERIALIZABLE(可串行化)
    SERIALIZABLE 是最高的隔離級(jí)別。它通過強(qiáng)制事務(wù)串行執(zhí)行,避免了前面說的幻讀的問題。加單來說,SERIALIZABLE會(huì)在讀取的每一行數(shù)據(jù)上都加鎖,所以可能導(dǎo)致大量的超時(shí)和鎖爭用問題。實(shí)際應(yīng)用中也很少會(huì)用到這個(gè)隔離級(jí)別,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒有并發(fā)的情況下,才考慮采用該級(jí)別。

InnoDB采用MVCC來支持高并發(fā),并實(shí)現(xiàn)了四個(gè)隔離級(jí)別。其默認(rèn)級(jí)別是 REPEATABLEB READ(可重復(fù)度),并且通過間隙鎖(next-key locking)策略防止幻讀的出現(xiàn)。間隙鎖使得InnoDB不僅僅鎖定查詢涉及的行,還會(huì)對(duì)索引中的間隙進(jìn)行鎖定,以防止幻影行的插入。

ANSI SQL隔離級(jí)別

隔離級(jí)別臟讀可能性不可重復(fù)度可能性幻讀可能性加鎖讀
READ UNCOMMITTEDYESYESYESNO
READ COMMITTEDNOYESYESNO
REPEATABLEB READNONOYESNO
SERIALIZABLENONONOYES

下面測試一下MySQL在 REPEATABLEB READ 隔離級(jí)別下能否避免幻讀(前提是InnoDB引擎)
在customer表做測試
MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法

在A事務(wù)開啟事務(wù),查詢年齡在12~16的結(jié)果
MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法
結(jié)果如下:此時(shí)A事務(wù)并沒有提交
MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法

B事務(wù),在customer表中插入一條age = 14的數(shù)據(jù)
MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法
select語句結(jié)果為
MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法
此時(shí)B事務(wù)未提交,customer表依然是
MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法
說明 REPEATABLEB READ 隔離級(jí)別可以避免臟讀。B事務(wù)commit之后customer表為
MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法
此時(shí)A事務(wù)再執(zhí)行select語句結(jié)果依然為
MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法
說明MySQL數(shù)據(jù)庫在 REPEATABLEB READ 隔離級(jí)別下可以避免幻讀(InnoDB引擎)。commit后再次執(zhí)行select結(jié)果為
MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法
現(xiàn)在就恢復(fù)了B事務(wù)的操作。

結(jié)論:MySQL數(shù)據(jù)庫在 REPEATABLEB READ 隔離級(jí)別下可以避免幻讀(InnoDB引擎)。數(shù)據(jù)庫的事務(wù)是為了保證數(shù)據(jù)的安全,事務(wù)特性中的一致性相對(duì)重要一些。

鎖是為了保證事務(wù)的隔離性。鎖是基于索引實(shí)現(xiàn)的。

讀鎖和寫鎖
    共享鎖(shared lock)和排他鎖(exclusive lock)也叫讀鎖(read lock)和寫鎖(write lock)
讀鎖是共享的,互相不阻塞的,多個(gè)客戶在同一時(shí)刻可以同時(shí)讀取同一個(gè)資源,而互不干擾。讀鎖對(duì)寫鎖阻塞。寫鎖則是排他的,也就是說一個(gè)寫鎖會(huì)阻塞其他的讀鎖和寫鎖,這是出于安全策略的考慮,只有這樣,才能確保在給定的時(shí)間里,只有一個(gè)用戶能執(zhí)行寫入,并防止其他用戶讀取正在寫入的統(tǒng)一資源。

    寫鎖比讀鎖有更高的優(yōu)先級(jí),一個(gè)寫鎖的請求可能會(huì)被插入到讀寫隊(duì)列的前面。

行鎖和表鎖
    表鎖是MySQL最基本的鎖策略,并且是開銷最小的策略。會(huì)鎖定整張表。沒有命中索引的操作會(huì)鎖表
    行鎖可以最大程度的支持并發(fā)處理,同時(shí)帶來了最大的鎖開銷 InnoDB 和 XtraDb 引擎實(shí)現(xiàn)了行級(jí)鎖。會(huì)鎖住某一行或者某幾行,表中其他行的數(shù)據(jù)可以進(jìn)行讀寫操作。命中索引,則會(huì)將某一行或者某幾行加鎖。

死鎖
    兩個(gè)或者多個(gè)事務(wù)在同一資源上相互占用,并請求鎖定對(duì)方占用的資源,從而導(dǎo)致惡性循環(huán)的現(xiàn)象。InnoDB處理死鎖的方式是,將持有最少行級(jí)排他鎖的事物進(jìn)行回滾。鎖的行為和順序是和存儲(chǔ)引擎相關(guān)的。以同樣的順序執(zhí)行語句,有些存儲(chǔ)引擎會(huì)產(chǎn)生死鎖,有些則不會(huì)。

悲觀鎖和樂觀鎖
    悲觀鎖,假設(shè)丟失更新一定存在;sql后面加上for update(排他鎖)。
   
樂觀鎖,假設(shè)丟失更新不一定發(fā)生。update時(shí)候存在版本,更新時(shí)候按版本號(hào)進(jìn)行更新。

記錄鎖、間隙鎖和臨鍵鎖
    記錄鎖,會(huì)鎖住某一行數(shù)據(jù),條件命中主鍵索引。where id = ?;如果在主鍵上加范圍查詢(where id > ?),記錄鎖會(huì)退化成間隙鎖,鎖住不符合條件的最近的值開始的所有。
    間隙鎖,會(huì)鎖住一個(gè)范圍,條件命中非主鍵、非唯一索引,只有在重復(fù)讀的隔離級(jí)別下存在。如果是(where age > ?) ,鎖住不符合條件的最近的值開始的所有(前閉后開),也就是鎖住索引中的間隙。
    臨鍵鎖,InnoDB默認(rèn)行級(jí)鎖,條件命中非主鍵、非唯一索引,會(huì)鎖住一個(gè)范圍,查出來的范圍以及相鄰的下一個(gè)區(qū)間都鎖住。where age = ?則該值兩側(cè)的值的范圍內(nèi)被鎖?。ㄇ伴]后開)。

意向共享鎖和意向排他鎖
    意向共享鎖,當(dāng)一個(gè)事務(wù)試圖對(duì)整個(gè)表進(jìn)行加共享鎖之前,首先需要獲得這個(gè)表的意向共享鎖。
    意向排他鎖,當(dāng)一個(gè)事務(wù)試圖對(duì)整個(gè)表進(jìn)行加排它鎖之前,首先需要獲得這個(gè)表的意向排它鎖。
    

到此,關(guān)于“MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


文章題目:MySQL數(shù)據(jù)庫事務(wù)與鎖的原理和用法
網(wǎng)站路徑:http://weahome.cn/article/ggjosc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部