MySQL關於事務常見的問題

山有木xi發表於2020-03-26

所謂事務,是指一組相互依賴的操作單位的集合,用來保證對資料庫的正確修改,保持資料的完整性,如果 一個事務的某個單元操作失敗,將取消本次事務的全部操作。從理論上來說,事務彼此應該完全隔離,以避免併發事務所導致的問題,但是,這樣會對效能產生極大的影響,因為事務必須按順序執行,在實際開發中,為了提升效能,事務會以較低的隔離級別執行,事務的隔離級別可以透過隔離事務熟悉指定

  • 事務的併發

髒讀:事務A讀取了事務B更新的資料,然後B回滾操作,A讀取到的是髒資料

不可重複讀:事務A多次讀取同一資料,事務B在事務A多次讀取的過程中,對資料做了更新並且提交,導致A多次讀取同一資料時,結果先後兩次讀到的資料結果不一致

幻讀:解決了不可重複讀,事務A對一個表中的所有的行的某個資料項做了修改,這時B有隊這個表插入了一行資料項,而這個資料項的陣列還是原先的數值,A檢視時看到的還是原來的陣列,其實這是B新增的,就像幻覺一樣

  • 事務的隔離級別

讀未提交:另一個事務修改了資料,但尚未提交,本事務中的SELECT會獨到這些違背提交的資料髒讀

不可重複讀:事務B在事務A多次讀取一個資料時對資料修改並提交,導致事務A多次讀取時,結果不一致

可重複讀:SELECT的結果是事務開始時間的狀態,因此,讀取到的結果是一致的,但是可能會有幻讀的現象

序列化:最高隔離級別,不會產生任何異常

  • MySQL的預設事務隔離級別為repeatableread

  • MySQL中預設事務隔離級別是“可重複讀”時並不會鎖住讀取到的行,寫資料會鎖住整張表

  • MySQL中事務級別為"未提交讀"時,寫資料只鎖住相應的行

  • MySQL中事務級別為“序列化”時,讀寫資料都會鎖住整張表

隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大,對於大多數的應用程式來說,可以儘量把資料庫系統的隔離級別設為Read Committed,能夠儘量避免髒讀,且有比較好的併發效能

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2682701/,如需轉載,請註明出處,否則將追究法律責任。

相關文章