HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    讀臟數(shù)據(jù)和不可重復(fù)讀(讀臟數(shù)據(jù)和不可重復(fù)讀解決)

    發(fā)布時間:2023-04-14 01:29:24     稿源: 創(chuàng)意嶺    閱讀: 78        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于讀臟數(shù)據(jù)和不可重復(fù)讀的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端

    官網(wǎng):https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    讀臟數(shù)據(jù)和不可重復(fù)讀(讀臟數(shù)據(jù)和不可重復(fù)讀解決)

    一、數(shù)據(jù)庫:為什么一級封鎖協(xié)議不能保證不讀臟數(shù)據(jù)?在修改的時候不是已經(jīng)加了X鎖了嗎為什么其他事務(wù)還能讀

    一級封鎖協(xié)議是:事務(wù)T在修改數(shù)據(jù)R之前必須先對其加X鎖,直到事務(wù)結(jié)束才釋放。事務(wù)結(jié)束包括正常結(jié)束(COMMIT)和非正常結(jié)束(ROLLBACK)。

    注意,該協(xié)議是規(guī)定在修改數(shù)據(jù)R之前必須加鎖。所以如果事務(wù)T僅是讀數(shù)據(jù)而不對其進(jìn)行修改,是不需要加鎖的;事務(wù)T在修改R之前,其他事務(wù)是能對R進(jìn)行讀取的,所以它不能保證可重復(fù)讀和不讀“臟”數(shù)據(jù)。

    二、SQL多用戶訪問數(shù)據(jù)庫怎樣解決沖突?

    sql多用戶訪問數(shù)據(jù)庫其實(shí)就是事務(wù)并發(fā),會引起如下問題:x0dx0a1、臟讀:一個事務(wù)讀取到了另外一個事務(wù)沒有提交的數(shù)據(jù)x0dx0a事務(wù)1:更新一條數(shù)據(jù)x0dx0a事務(wù)2:讀取事務(wù)1更新的記錄x0dx0a事務(wù)1:調(diào)用commit進(jìn)行提交x0dx0a此時事務(wù)2讀取到的數(shù)據(jù)是保存在數(shù)據(jù)庫內(nèi)存中的數(shù)據(jù),稱為臟讀。x0dx0a讀到的數(shù)據(jù)為臟數(shù)據(jù)x0dx0a詳細(xì)解釋:x0dx0a臟讀就是指:當(dāng)一個事務(wù)正在訪問數(shù)據(jù),并且對數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時,x0dx0a另外一個事務(wù)也訪問這個數(shù)據(jù),然后使用了這個數(shù)據(jù)。因?yàn)檫@個數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另外一個x0dx0a事務(wù)讀到的這個數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。x0dx0a2、不可重復(fù)讀:在同一事務(wù)中,兩次讀取同一數(shù)據(jù),得到內(nèi)容不同x0dx0a事務(wù)1:查詢一條記錄x0dx0a事務(wù)2:更新事務(wù)1查詢的記錄x0dx0a事務(wù)2:調(diào)用commit進(jìn)行提交x0dx0a事務(wù)1:再次查詢上次的記錄x0dx0a此時事務(wù)1對同一數(shù)據(jù)查詢了兩次,可得到的內(nèi)容不同,稱為不可重復(fù)讀。x0dx0a3、幻讀:同一事務(wù)中,用同樣的操作讀取兩次,得到的記錄數(shù)不相同x0dx0a事務(wù)1:查詢表中所有記錄x0dx0a事務(wù)2:插入一條記錄x0dx0a事務(wù)2:調(diào)用commit進(jìn)行提交x0dx0a事務(wù)1:再次查詢表中所有記錄x0dx0a此時事務(wù)1兩次查詢到的記錄是不一樣的,稱為幻讀x0dx0a詳細(xì)解釋:x0dx0a幻讀是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時發(fā)生的一種現(xiàn)象,例如第一個事務(wù)對一個表中的數(shù)據(jù)進(jìn)行了修改,x0dx0a這種修改涉及到表中的全部數(shù)據(jù)行。同時,第二個事務(wù)也修改這個表中的數(shù)據(jù),這種修改是向表x0dx0a中插入一行新數(shù)據(jù)。那么,以后就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,x0dx0a就好象發(fā)生了幻覺一樣。x0dx0a處理以上隔離級別的問題,采用如下方是:x0dx0a事務(wù)隔離五種級別:x0dx0aTRANSACTION_NONE不使用事務(wù)。x0dx0aTRANSACTION_READ_UNCOMMITTED允許臟讀。x0dx0aTRANSACTION_READ_COMMITTED防止臟讀,最常用的隔離級別,并且是大多數(shù)數(shù)據(jù)庫的默認(rèn)隔離級別x0dx0aTRANSACTION_REPEATABLE_READ可以防止臟讀和不可重復(fù)讀,x0dx0aTRANSACTION_SERIALIZABLE可以防止臟讀,不可重復(fù)讀取和幻讀,(事務(wù)串行化)會降低數(shù)據(jù)庫的效率x0dx0a以上的五個事務(wù)隔離級別都是在Connection接口中定義的靜態(tài)常量,x0dx0a使用setTransactionIsolation(intlevel)方法可以設(shè)置事務(wù)隔離級別。x0dx0a如:con.setTransactionIsolation(Connection.REPEATABLE_READ);x0dx0a注意:事務(wù)的隔離級別受到數(shù)據(jù)庫的限制,不同的數(shù)據(jù)庫支持的的隔離級別不一定相同x0dx0a1臟讀:修改時加排他鎖,直到事務(wù)提交后才釋放,讀取時加共享鎖,讀取完釋放事務(wù)1讀取數(shù)據(jù)時加上共享鎖后(這樣在事務(wù)1讀取數(shù)據(jù)的過程中,其他事務(wù)就不會修改該數(shù)據(jù)),不允許任何事物操作該數(shù)據(jù),只能讀取,之后1如果有更新操作,那么會轉(zhuǎn)換為排他鎖,其他事務(wù)更無權(quán)參與進(jìn)來讀寫,這樣就防止了臟讀問題。x0dx0a但是當(dāng)事務(wù)1讀取數(shù)據(jù)過程中,有可能其他事務(wù)也讀取了該數(shù)據(jù),讀取完畢后共享鎖釋放,此時事務(wù)1修改數(shù)據(jù),修改完畢提交事務(wù),其他事務(wù)再次讀取數(shù)據(jù)時候發(fā)現(xiàn)數(shù)據(jù)不一致,就會出現(xiàn)不可重復(fù)讀問題,所以這樣不能夠避免不可重復(fù)讀問題。x0dx0a2不可重復(fù)讀:讀取數(shù)據(jù)時加共享鎖,寫數(shù)據(jù)時加排他鎖,都是事務(wù)提交才釋放鎖。讀取時候不允許其他事物修改該數(shù)據(jù),不管數(shù)據(jù)在事務(wù)過程中讀取多少次,數(shù)據(jù)都是一致的,避免了不可重復(fù)讀問題x0dx0a3幻讀問題:采用的是范圍鎖RangeSRangeS_S模式,鎖定檢索范圍為只讀,這樣就避免了幻影讀問題。

    三、Access數(shù)據(jù)庫中如何避免臟數(shù)據(jù)

    臟讀dirty reads:當(dāng)事務(wù)讀取還未被提交的數(shù)據(jù)時,就會發(fā)生這種事件。舉例來說:Transaction 1 修改了一行數(shù)據(jù),然后 Transaction 2 在 Transaction 1 還未提交修改操作之前讀取了被修改的行。如果 Transaction 1 回滾了修改操作,那么 Transaction 2 讀取的數(shù)據(jù)就可以看作是從未存在過的。

    不可重復(fù)的讀non-repeatable reads:當(dāng)事務(wù)兩次讀取同一行數(shù)據(jù),但每次得到的數(shù)據(jù)都不一樣時,就會發(fā)生這種事件。舉例來說:Transaction 1 讀取一行數(shù)據(jù),然后 Transaction 2 修改或刪除該行并提交修改操作。當(dāng) Transaction 1 試圖重新讀取該行時,它就會得到不同的數(shù)據(jù)值(如果該行被更新)或發(fā)現(xiàn)該行不再存在(如果該行被刪除)。

    虛讀phantom read:如果符合搜索條件的一行數(shù)據(jù)在后面的讀取操作中出現(xiàn),但該行數(shù)據(jù)卻不屬于最初的數(shù)據(jù),就會發(fā)生這種事件。舉例來說:Transaction 1 讀取滿足某種搜索條件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索條件的一個新行。如果 Transaction 1 重新執(zhí)行產(chǎn)生原來那些行的查詢,就會得到不同的行。

    MYSQL事務(wù)隔離級別的認(rèn)識

    2010-08-06 10:27

    在hibernate中如果要連續(xù)不間斷的保存多個實(shí)體的實(shí)例,那么在我們保存第一個的時候,其實(shí)在數(shù)據(jù)庫里是不存在數(shù)據(jù)的,即使用Session.flush()也無濟(jì)于事,這到底是怎么回事呢?讓我很是疑惑.......

    在查閱了相關(guān)的資料后,原來是數(shù)據(jù)庫對于事務(wù)的隔離級別的限制問題,而我原來的MYSQL數(shù)據(jù)庫正好是不支持我上述操作的隔離級別。

    1、在MYSQL中查詢事務(wù)隔離級別:

    select @@tx_isolation;(tx其實(shí)就是transaction的縮寫或者習(xí)慣縮寫法)

    我的結(jié)果是REPEATABLE-READ(即可重復(fù)讀,稍后會引用專業(yè)結(jié)束文檔)

    2、修改MYSQL事務(wù)隔離界別:

    set transaction isolation level 目標(biāo)隔離級別;

    3、再次查詢隔離級別進(jìn)行檢驗(yàn)是否已經(jīng)成功修改。

    這樣在修改了隔離級別之后,在進(jìn)行save()的時候,數(shù)據(jù)庫中就會存在一些數(shù)據(jù)了,問題解決了。關(guān)于其他的數(shù)據(jù)庫產(chǎn)品,思想都是一樣的。

    附加、官方的SQL事務(wù)隔離級別文檔:

    SQL標(biāo)準(zhǔn)定義了4類隔離級別,包括了一些具體規(guī)則,用來限定事務(wù)內(nèi)外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。

    Read Uncommitted(讀取未提交內(nèi)容)

    在該隔離級別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。本隔離級別很少用于實(shí)際應(yīng)用,因?yàn)樗男阅芤膊槐绕渌墑e好多少。讀取未提交的數(shù)據(jù),也被稱之為臟讀(Dirty Read)。

    Read Committed(讀取提交內(nèi)容)

    這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別(但不是MySQL默認(rèn)的)。它滿足了隔離的簡單定義:一個事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變。這種隔離級別 也支持所謂的不可重復(fù)讀(Nonrepeatable Read),因?yàn)橥皇聞?wù)的其他實(shí)例在該實(shí)例處理其間可能會有新的commit,所以同一select可能返回不同結(jié)果。

    Repeatable Read(可重讀)

    這是MySQL的默認(rèn)事務(wù)隔離級別,它確保同一事務(wù)的多個實(shí)例在并發(fā)讀取數(shù)據(jù)時,會看到同樣的數(shù)據(jù)行。不過理論上,這會導(dǎo)致另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時,另一個事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時,會發(fā)現(xiàn)有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機(jī)制解決了該問題。

    Serializable(可串行化)

    這是最高的隔離級別,它通過強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數(shù)據(jù)行上加上共享鎖。在這個級別,可能導(dǎo)致大量的超時現(xiàn)象和鎖競爭。

    四、并發(fā)操作可能會產(chǎn)生哪幾類數(shù)據(jù)不一致?用什么方法能避免各種不一樣的情況?

    大致會產(chǎn)生三類:1、丟失更新2、不可重復(fù)讀3、讀“臟”數(shù)據(jù)。解決方法:封鎖:排他鎖(X鎖),共享鎖(S鎖),三級封鎖協(xié)議,兩段鎖協(xié)議(2PL),其他的我也不清楚了,這些也是我在書上看的,不要見怪!

    以上就是關(guān)于讀臟數(shù)據(jù)和不可重復(fù)讀相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。


    推薦閱讀:

    讀臟數(shù)據(jù)和不可重復(fù)讀(讀臟數(shù)據(jù)和不可重復(fù)讀解決)

    博客營銷價值的主要表現(xiàn)有(博客營銷價值的主要表現(xiàn)有哪些方面)

    杭州的女生好看嗎(杭州的女孩子很漂亮嗎)