要是沒有事務會怎麼樣?
要是mysql中沒有事務這個概念,以轉賬為例:
Eg:
1、檢查理财賬戶中的餘額是否高于2000元
2、從理财賬戶的餘額中減去2000元
3、在活動存款賬戶上增加2000元
若是在第2步執行完成後出現異常,則餘額少了2000,存款賬戶卻沒有加2000,好吧,這不是我mysql的風格,于是我(事務)就這樣誕生了
什麼是事務?
如果包含多個步驟的操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。為了實作這一概念,我為此定義了一些規則,如下:
原子性:是不可分割的最小操作機關,要麼同時成功,要麼同時失敗。
持久性:當事務送出或者復原後,資料庫會持久化的儲存資料。
一緻性:事務操作前後,資料總量不變。
隔離性:多個事務之間,互相獨立
這下可以說是萬無一失了,我可真是個天才。
這樣一直到了測試小哥哥過來測試的時候。
測試:你有沒有發現一件事?
我:什麼?
測試:當兩個事務操作同一行資料時,我竟然讀到了你沒有送出的資料耶!而且每次讀的結果還都不一樣!而且有時我修改了全表資料後,竟然找不到自己的修改,就像做夢一樣!
我:啊?是嘛?大哥,你放心,晚上我加個班把它搞定。
唉,好尴尬,于是我痛定思痛,連夜想出了解決辦法。我把測試小哥哥提出的問題想出了三個專業術語。髒讀/虛讀/幻讀。
髒讀:一個事務,讀取到另一個事務中沒有送出的資料。
不可重複讀(虛讀):在同一個事務中,兩次讀取到的資料不一樣。
幻讀:一個事務操作(DML/增删改)資料表中所有記錄,另一個事務添加了一條資料,則第一個事務查詢不到自己的修改。
發現問題就好辦了,依次解決呗!為此我連夜請教了大哥Oracle,不負所望,得到以下結果

ps:記得以前隻有兩種的,現在似乎新增了隻讀隔離級别。下邊都按沒修改前。
于是,我站在了巨人的肩膀上,對此作出了一些完善,又增加了兩種隔離特性,分别是read uncommitted: 讀未送出。 repeatable read: 可重複讀。現在我為自己定義的隔離級别分别是:
read uncommitted: 讀未送出
*産生的問題:*髒讀,不可重複讀,幻讀
read committed: 讀已送出
*産生的問題:*不可重複讀,幻讀
repeatable read: 可重複讀
*産生的問題:*幻讀
serializable:串行化
可以解決所有問題
這下總該萬無一失了,我可真是個小機靈鬼!
其中有兩種事務隔離級别是和MVCC有關的,篇幅太長,打算留到下一篇文章講解,敬請期待!