數據庫事務特性:acid
a:原子性,一次操作要么都成功,要么都失敗回滾。(atomicity)
c:一致性,數據執行前和執行后要保持一致。(consistency)[轉賬來說:比如一個賬戶事務執行前和是500,執行后要必須確保和是500]
i:隔離性,并發的多個事務之間相互隔離,互不干擾。(isolation)[事務a要么在事務b執行前執行或者執行后執行]提供好幾種隔離級別
d:永久性,事務執行之后對數據庫的改變是永久性的。(durability)
臟讀:一個事務讀取了另一個事務未提交的數據。
不可重復讀:一個事務中多次讀取同一個數據得到的結果不一致。(查詢間隔中,其他事務改變數據提交了事務)
不可重復讀和臟讀的區別是,臟讀是某一事務讀取了另一個事務未提交的臟數據,而不可重復讀則是讀取了前一事務提交的數據。
幻讀(虛讀):是事務非獨立執行過程中發生的。
比如事務a修改數據庫中所有數據的name都為張三,事務b這個時候插入了一條新的數據name是李四并且提交了,
事務a的用戶再去查數據發現還有一條(事務b添加的)沒有更新,就像產生幻覺一樣,就是發生了幻讀。
幻讀和不可重復讀都是讀取了另一條已經提交的事務(這點就臟讀不同),所不同的是不可重復讀查詢的都是同一個數據項,而幻讀針對的是一批數據整體(比如數據的個數)。
MySQL數據庫為我們提供的四種隔離級別:
① Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發生。
② Repeatable read (可重復讀):可避免臟讀、不可重復讀的發生。
③ Read committed (讀已提交):可避免臟讀的發生。
④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。
以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執行效率就越低。
像Serializable這樣的級別,就是以鎖表的方式(類似于Java多線程中的鎖)使得其他的線程只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。在MySQL數據庫中默認的隔離級別為Repeatable read (可重復讀)。
在MySQL數據庫中查看當前事務的隔離級別:
select @@tx_isolation;
在MySQL數據庫中設置事務的隔離 級別:
set tx_isolation=’隔離級別名稱;’
記?。涸O置數據庫的隔離級別一定要是在開啟事務之前!