一、前言
mysql從5.5.8開始,innodb就是預設的儲存引擎,innodb最大的特點是:支援事務、支援行級鎖。二、事務併發帶來的問題既然支援事務,那麼就會有處理併發事務帶來的問題:
更新丟失、髒讀、不可重複讀、幻讀。
相應的為了解決這四個問題,就產生了事務隔離級別:
讀未提交(read uncommitted),讀已提交(read committed),可重複讀(repeatable read),序列化(serializable)。
在平常的專案開發裡資料庫操作一般都是併發執行的,即有多個事務併發執行,資料庫事務併發帶來的問題有:
1、丟失更新:最後的更新覆蓋了其他事務之前的更新,而事務之間並不知道,發生更新丟失。
更新丟失,可以完全避免,應用對訪問的資料加鎖即可。2、髒讀:事務b讀取到事務a已經修改但尚未提交的資料。
例如事務a正在訪問資料,並且對資料進行了修改,更改了一行資料,這種修改還沒有提交到資料庫中,而事務b在事務a提交更新之前讀取了已更新的行,然後使用了這個資料。3、不可重複讀:在同一事務中,兩次讀取同一資料,得到內容不同,也就是有其他事務更改了這些資料。如果事務a回滾該更新,則事務b使用的這個資料由於還沒有提交,就會被認為是不曾存在的資料,即為髒資料,根據髒資料所做的操作可能是不正確的。
指在乙個事務內多次讀同一資料。在這個事務還沒有結束時,另乙個事務也訪問該資料。那麼,在第乙個事務中的兩次讀資料之間,由於第二個事務的修改導致第乙個事務兩次讀取的資料可能不太一樣。這就發生了在乙個事務內兩次讀到的資料是不一樣的情況,因此稱為不可重複讀。4、幻讀:乙個事務在執行過程中讀取到了另乙個事務已提交的插入資料。
即在第乙個事務開始時讀取到一批資料,但此後另乙個事務又插入了新資料並提交,此時第乙個事務又讀取這批資料但發現多了一條,即好像發生幻覺一樣。髒讀:讀取到修改但未提交的資料
幻讀:讀取到新增且已提交的資料
三、事務隔離機制
為了解決上述提到的事務併發問題,資料庫提供一定的事務隔離機制來解決這個問題。資料庫的事務隔離越嚴格,併發***越小,但付出的代價也就越大,因為事務隔離實質上就是使用事務在一定程度上「序列化」 進行,這顯然與「併發」 是矛盾的。
資料庫的隔離級別有4個,由低到高依次為read uncommitted、read committed、repeatable read、serializable。
這四個級別可以逐個解決丟失更新(髒寫)、髒讀、不可重複讀、幻讀這幾類問題。
備註 : √ 代表可能出現,× 代表不會出現。
mysql 資料庫的預設隔離級別為 repeatable read , 檢視方式:
四、總結
事務併發帶來的問題
髒讀 事務a對某個資料進行修改,但是還沒提交到資料庫中 此時事務b對這個資料進行訪問,我們把b事務訪問到的這個未提交的資料稱為 髒資料 事務b的這種行為稱為 髒讀 丟失修改 事務a和事務b同時對某乙個資料進行訪問,且此時a修改了資料如a a 1,b同時也對a進行修改,a a 1,此時a的修改結果將會...
Mysql關於事務併發帶來的問題
mysql從5.5.8開始,innodb就是預設的儲存引擎,innodb最大的特點是 支援事務 支援行級鎖。既然支援事務,那麼就會有處理併發事務帶來的問題 更新丟失 髒讀 不可重複讀 幻讀 相應的為了解決這四個問題,就產生了事務隔離級別 未提交讀 read uncommitted 已提交讀 read...
資料庫事務併發帶來的問題 及並行
併發與並行的區別 併發 當有多個執行緒在操作時 如果系統只有乙個cpu 則它根本不可能真正同時進行乙個以上的執行緒,它只能 把cpu執行時間劃分成若干個時間段,再將時間段分配給各個執行緒執行,在乙個時間段的執行緒 執行時,其它執行緒處於掛起狀。這種方式我們稱之為併發 concurrent 並行 當系...