不可重複讀:在同一個事務中,對於同一份數據讀取到的結果不一致。好比,事務B在事務A提交前讀到的結果,和提交後讀到的結果可能不一樣。不可重複讀出現的緣由就是事務併發修改記錄,要避免這種狀況,最簡單的方法就是對要修改的記錄加鎖,在事物B操做的時候,給記錄加鎖,A沒法寫入,這會致使鎖競爭加重,影響性能。另外一種方法是經過MVCC能夠在無鎖的狀況下,copy一個快照進行修改。避免不可重複讀。
幻讀:在同一個事務中,同一個查詢屢次返回的結果不一致。事務A新增了一條記錄,事務B在事務A提交先後各執行了一次查詢操做,發現後一次比前一次多了一條記錄。幻讀是因爲併發事務增長記錄致使的,這個不能像不可重複讀經過記錄加鎖解決,由於對於新增的記錄根本沒法加鎖。這個是往裏面加入一個新的紀錄,無法和之前同樣在記錄上加鎖,須要將事務串行化,讀寫分離,才能避免幻讀。可是能夠利用gap lock來解決問題數據庫
一個數據庫,你能夠簡單的認爲一個文件系統。應對高併發的讀,寫,修改,刪除,天然會帶來不少的不一致的問題。如何讀的同時處理有人正在進行寫入。mvcc根據的正是利用快照,因而存在數據庫的多種版本,不一樣的時刻的操做對應着不一樣的數據庫的版本。髒數據問題,幻讀的問題。併發
在修改的時候,有些數據庫能夠進行排隊(serializable),讀寫分離,能夠解決併發,可是效率和延時會所以上升。若是採用加鎖的原則,那麼會相應的利用表鎖,頁鎖定以及行鎖,鎖之間天然會存在搶佔資源,等待問題,形成的死鎖。有些乾脆複製一份數據,寫入的時候就是在這個快照上面就行修改,而後進行提交,可是大量的複製天然會形成效率的降低。mvc