天天看點

對Mysql事務的一些見解

要是沒有事務會怎麼樣?

要是mysql中沒有事務這個概念,以轉賬為例:

Eg:

1、檢查理财賬戶中的餘額是否高于2000元

2、從理财賬戶的餘額中減去2000元

3、在活動存款賬戶上增加2000元

若是在第2步執行完成後出現異常,則餘額少了2000,存款賬戶卻沒有加2000,好吧,這不是我mysql的風格,于是我(事務)就這樣誕生了

什麼是事務?

如果包含多個步驟的操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。為了實作這一概念,我為此定義了一些規則,如下:

原子性:是不可分割的最小操作機關,要麼同時成功,要麼同時失敗。

持久性:當事務送出或者復原後,資料庫會持久化的儲存資料。

一緻性:事務操作前後,資料總量不變。

隔離性:多個事務之間,互相獨立

這下可以說是萬無一失了,我可真是個天才。

這樣一直到了測試小哥哥過來測試的時候。

測試:你有沒有發現一件事?

我:什麼?

測試:當兩個事務操作同一行資料時,我竟然讀到了你沒有送出的資料耶!而且每次讀的結果還都不一樣!而且有時我修改了全表資料後,竟然找不到自己的修改,就像做夢一樣!

我:啊?是嘛?大哥,你放心,晚上我加個班把它搞定。

唉,好尴尬,于是我痛定思痛,連夜想出了解決辦法。我把測試小哥哥提出的問題想出了三個專業術語。髒讀/虛讀/幻讀。

髒讀:一個事務,讀取到另一個事務中沒有送出的資料。

不可重複讀(虛讀):在同一個事務中,兩次讀取到的資料不一樣。

幻讀:一個事務操作(DML/增删改)資料表中所有記錄,另一個事務添加了一條資料,則第一個事務查詢不到自己的修改。

發現問題就好辦了,依次解決呗!為此我連夜請教了大哥Oracle,不負所望,得到以下結果

對Mysql事務的一些見解

ps:記得以前隻有兩種的,現在似乎新增了隻讀隔離級别。下邊都按沒修改前。

于是,我站在了巨人的肩膀上,對此作出了一些完善,又增加了兩種隔離特性,分别是read uncommitted: 讀未送出。 repeatable read: 可重複讀。現在我為自己定義的隔離級别分别是:

read uncommitted: 讀未送出

*産生的問題:*髒讀,不可重複讀,幻讀

read committed: 讀已送出

*産生的問題:*不可重複讀,幻讀

repeatable read: 可重複讀

*産生的問題:*幻讀

serializable:串行化

可以解決所有問題

這下總該萬無一失了,我可真是個小機靈鬼!

其中有兩種事務隔離級别是和MVCC有關的,篇幅太長,打算留到下一篇文章講解,敬請期待!