1. 程式人生 > 其它 >【1.2】mysql遷移實踐及注意事項

【1.2】mysql遷移實踐及注意事項

Mysql事務

mysql事務定義

事務:事務是併發控制的基本單元,事務是一個操作序列,要麼都執行,要麼都不執行,他是一個不可分割的工作單位,事務是維護資料庫一致性的單位。

事務的四大特性:原子性,一致性,隔離性,永續性

  • 原子性,一個事務是一個原子性的操作,那麼一個事務要麼成,要不就不成
  • 一致性,在操作的前後資料總量不變,並且合法的資料才能被寫入
  • 隔離性,隔離性主要是多個使用者可以併發訪問,相互之間是隔離的
  • 永續性,是代表資料的操作在提交結束以後那麼操作的結果是持久的,資料的操作結果要得到固化。

事務的隔離性

多次讀取併發中出現的問題

  • 髒讀:就是一個事務在讀取事務在處理的過程中,還在處理並沒有提交,另外一個事務就讀取了該事務,那麼肯定是是不行的(例如:小明在存款的過程中,繼續了另外一個事務查詢存款,查詢到已經儲存成功,但是後面儲存人員資訊出現問題,倒置沒有儲存成功,那麼查詢已經成功了就出現了問題)

  • 不可重複讀:是指一個事務執行兩次那麼兩個的資料是不同的,一個事務執行兩次查詢返回了不同的結果,其中的原因是因為在第一個事務在執行第一次和第二次查詢的過程中。另外一個事務對資料進行了修改

  • 幻讀:是指一個事務連續兩次查詢一個範圍內的結果,出現的數量不同。(其中一個原因是因為在讀取的過程中由於在第一次查詢中第二次查詢後會多一行資料的情況,並且沒有說兩次查詢是在同一個事務當中)

事務的四個隔離級別

  • 讀未提交(Read UnCommitted)
    這裡顧名思義,讀未提交就是對於一個事務在未提交的過程中就被讀到。
    例如:老婆給老公轉300元,轉錯了轉成500元,但是還沒轉就被老公看見很高興,能多得到錢,但是妻子發現後改成300元這時老公還不知道。
    因此這種的方式會存在髒讀,幻讀,以及不可重複讀的問題。

  • 讀提交(Read commit)
    讀提交顧名思義,就是隻能讀取已經提交的資料。是sqlserver以及oracle的方式。
    例如其實去買零食花100元,但是妻子從他的賬戶要轉出兩百買菜,原本他發現自己賬戶裡面有200,但是買零食的時候發現錢不夠了。零錢變成了0。
    這種方式有效的解決了髒讀的問題,但是存在不可重複讀,以及幻讀的問題。

  • 可重讀讀(Repeated read)
    這裡採用的可重複讀的意義是當一個查詢開啟的時候其他的update的操作不可以進行,是Mysql的常用的方式。
    例如:男子用100元零花錢去買零食,那麼著時候他的老婆再想再賬戶裡面拿錢去買菜是不可以的。
    但是會這種情況會出現幻讀的情況。
    例如:他老婆查詢到他是花了100買零食,但是於此同時他有花了100買了青菜,當她老婆列印消費單的時候會發現雄消費是200元。

  • 序列化(serialized)
    這種方式是將所有的操作當成一個序列來進行處理。但是這種方式效率特慢一般不會採用這種方式。
    例如:老公買零食----》妻子查賬-----》老公買水果------》妻子列印賬單

解決方式

幻讀產生的原因

主要是由於在讀的過程中有其他的插入的操作所導致。

  • 在快照讀的情況下采用MVCC的模式
  • 在當前讀的情況下采用Next-key的方式來進行加鎖。