回覆列表
  • 1 # 此生唯一

    這個問題涉及到mysql的術語有髒讀,讀寫鎖,事務隔離級別,下面一一來解釋。

    髒讀:事務一修改資料中的記錄時,事務還沒提交,這時候事務二正好讀取到了這條修改過的資料,然後事務一因為某些原因事務回滾,資料回到了原來的狀態,事務二讀到的資料就是髒資料,整個過程就是髒讀!

    髒讀用大白話來說就是:幹哈呀?明明資料庫中沒有這個資料,哪來的這玩意?

    不可重複讀:事務一在一個事務中多次讀取同樣的資料,這時候另一個事務剛好在修改資料,導致事務一多次獲取到的資料不一致,這就是不可重複讀!不可重複讀通常出現在update中!

    不可重複讀用大白話來說:怎麼回事?我吃肉吃著吃著,誰給我整成大白菜了?

    幻讀: 幻讀:事務一先根據條件獲取到M條資料,然後事務二又增加或減少了N條資料,導致事務一再次搜尋的時候發現多了或者少了N條資料,也就是發生了幻讀。通常出現在insert或者delete中 !

    幻讀用大白話來說就是:啥玩意?剛才是M,轉個頭就給我整成M±N了,勞資出現幻覺了?

    下面來看看mysql中的鎖:

    寫鎖(排它鎖):獲取到排它鎖的事務可以對資料進行任何操作,而且別的事務不能獲取到資料的任何其他鎖!

    讀鎖(共享鎖):所有事務都可以公平的獲取到資料的共享鎖,進行資料的讀取!

    事務隔離級別有以下幾種,讀未提交,讀已提交,可重複讀,序列化,分別會對鎖進行不同的控制,

    以下的事務隔離級別解決錯誤資料的能力越來越高:

    1,讀未提交(0)啥都解決不了(0);

    2,讀已提交(1)能解決髒讀(1);

    3,可重複讀(2)能解決髒讀(1)和不可重複讀(2);

    4,序列化(3)啥都能解決(1,2,3);

    如果mysql開啟的事務隔離級別是讀未提交,也就相當於沒有鎖,資料隨便讀,很容易就能讀到髒資料,容易出現髒讀的現象,生產環境肯定不能用這樣的事務隔離級別!

    所以需要保證資料安全併兼容效能,就需要根據場景選擇不同的事務傳播級別,因為資料錯誤主要出現在髒讀,生產中大多數用的是讀已提交事務傳播級別!

    最近正在持續的分享JAVA,資料庫相關的技術,力保通俗易懂,敬請關注。。。

  • 中秋節和大豐收的關聯?
  • 花生香菇煲雞爪怎麼做?