acid(atomicity、consistency、isolation、durability,即原子性、一致性、隔離性、永續性)
髒讀(dirty read)、不可重複讀(non-repeatable read)、幻讀(phantom read)
讀未提交(read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(serializable )
在實現上,資料庫裡面會建立乙個檢視,訪問的時候以檢視的邏輯結果為準。在「可重複讀」隔離級別下,這個檢視是在事務啟動時建立的,整個事務存在期間都用這個檢視。在「讀提交」隔離級別下,這個檢視是在每個sql語句開始執行的時候建立的。這裡需要注意的是,「讀未提交」隔離級別下直接返回記錄上的最新值,沒有檢視概念;而「序列化」隔離級別下直接用加鎖的方式來避免並行訪問。
在mysql中,實際上每條記錄在更新的時候都會同時記錄一條回滾操作。記錄上的最新值,通過回滾操作,都可以得到前乙個狀態的值。
假設乙個值從1被按順序改成了2、3、4,在回滾日誌裡面就會有類似下面的記錄。
當前值是4,但是在查詢這條記錄的時候,不同時刻啟動的事務會有不同的read-view。如圖中看到的,在檢視a、b、c裡面,這乙個記錄的值分別是1、2、4,同一條記錄在系統中可以存在多個版本,就是資料庫的多版本併發控制(mvcc)。對於read-view a,要得到1,就必須將當前值依次執行圖中所有的回滾操作得到。
同時你會發現,即使現在有另外乙個事務正在將4改成5,這個事務跟read-view a、b、c對應的事務是不會衝突的。
你一定會問,回滾日誌總不能一直保留吧,什麼時候刪除呢?答案是,在不需要的時候才刪除。也就是說,系統會判斷,當沒有事務再需要用到這些回滾日誌時,回滾日誌會被刪除。
什麼時候才不需要了呢?就是當系統裡沒有比這個回滾日誌更早的read-view的時候。
基於上面的說明,我們來討論一下為什麼建議你盡量不要使用長事務。
長事務意味著系統裡面會存在很老的事務檢視。由於這些事務隨時可能訪問資料庫裡面的任何資料,所以這個事務提交之前,資料庫裡面它可能用到的回滾記錄都必須保留,這就會導致大量占用儲存空間。
在mysql 5.5及以前的版本,回滾日誌是跟資料字典一起放在ibdata檔案裡的,即使長事務最終提交,回滾段被清理,檔案也不會變小。
第三講 前置知識
啥是前置的知識?應該是一種粗略的大概的,對其進行解。就像平時玩戲,要知道這個遊戲有啥子背景,講的是啥事兒,如何去玩它。包括遊戲中各類的圖示代表什麼個意思,初期對其進行初步的了解。說的好像你很屌的樣子,再屌又咋滴,還不是屌絲乙個,光棍一條,哈哈!你說我,老大咱都要各自照照鏡先吧。我已經夠青出於蘭了,你...
Java基礎第三講
一.運算子 1.邏輯運算子 一般用於連線boolean型別的表示式或值 並且 有false則false 或者 有true則true 非 非false則true,非true則false 偶數個不會改變本身 異或 結果相同為false,結果不同則為true 短路與 與 的區別 結果一樣,具有短路效果,如...
第三講 Docker 安裝
我們將在centos linux上安裝docker。如果沒有centos系統,你可以使用虛擬機器virtual box來安裝centos,可參考下面的文章 docker的版本 通常安裝社群版本。系統要求 要安裝docker ce,需要使用centos 7的穩定版本 核心版本必須3.8或之後 注意 必...