數據庫事務具備四個特徵,分別是原子性(Atomicity)、一致性(Consistency)、隔離性(Isoation)、持久性(Durability),簡稱爲事務的ACID特性。sql
事務的隔離性是指在併發環境中,併發的事務是相互隔離的。SQL標準中定義了四種數據庫事務隔離級別,級別從低到高分別爲:讀未提交(Read Uncommitted)、讀已提交(Read Committed)、可重複讀(Repeatable Read)、串行化(Serializable)。在事務的併發操做中會出現髒讀、不可重複讀、幻讀。在事務的併發操做中第二類更新丟失能夠經過樂觀鎖和悲觀鎖解決。
數據庫
一 讀未提交(Read Uncommitted)併發
1. 該隔離級別, 全部的事務均可以看到其餘未提交事務的執行結果。通俗的講就是,在一個事務中能夠讀取到另外一個事務中新增或修改但未提交的數據 2. 該隔離級別可能致使問題的髒讀。由於另外一個事務可能回滾,因此在第一個事務中讀取到的數據極可能是無效的數據,形成髒讀現象 > set tx_isolation='READ-UNCOMMITTED';
1.這是大多數數據庫系統默認的隔離級別(但不是MySQL默認的) 2.一個事務只能看見已經提交事務所作的修改。換句話說,一個事務從開始直到提交以前,所作的任何修改對其餘事務都是不可見的 3. 該隔離級別可能致使的問題是不可重複讀,兩次執行一樣的查詢,可能會獲得不一樣的結果 > set tx_isolation='READ-COMMITTED';
1.這是Mysql事務隔離的級別 2. 他確保同一事務的多個實例在併發讀取數據時,會看到一樣的數據行。通俗來說,可重複讀在一個事務裏讀取數據,怎麼讀都不會變,除非提交了該事務,再次進行讀取。 3. 該隔離級別存在的問題是幻讀 set tx_isolation='REPEATABLE-READ';
下面看如何出現幻讀的spa
1.這是最高的隔離級別 2. 他要經過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。通俗的講就是,假如兩個事務都操做到同一數據行,那麼這個數據行就會被鎖定,只容許先讀取/操做到數據行的事務優先操做,只有當事務提交了,數據行纔會解鎖,後一個事務才能成功操做這個數據行,不然只能一直等待 3. 該隔離級別可能致使大量的超時現象和鎖競爭 > set tx_isolation='SERIALIZABLE';
注: code
1.這裏使用ctime,utime字段進行查詢和修改,是爲了展現使用非索引字段也有事務隔離效果blog
2. 在該事務隔離級別中,select語句會自動獲取共享鎖,update/insert/delete會自動獲取排他鎖排序
3. 一個事務中的一行記錄的共享鎖被拿走,其餘事務只能獲取該行的共享鎖,不能獲取排它鎖;一個事務中的一行記錄的排他鎖被拿走,其餘事務不能獲取該行的共享鎖和排他鎖索引
從上面的四種數據庫事務隔離級別介紹能夠對應出解決的問題,如圖:事務
悲觀鎖:ci
悲觀鎖分爲共享鎖和排它鎖。
共享鎖又稱爲讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一數據能夠共享一把鎖,共享鎖是用來讀取數據的。另一個事務獲取了同一數據的共享鎖,其餘事務就不能獲取該數據的排他鎖。
排他鎖又稱爲寫鎖,簡稱X鎖,顧名思義,排它鎖就是不能與其餘鎖共存,如一個事務獲取了一個數據行的排他鎖,其餘事務就不能再獲取該行的其餘鎖,包括共享鎖和排它鎖,另外不存什麼事務隔離級別,update/insert/delete會自動獲取排它鎖
共享鎖獲取方式:select * from account where name='jack' lock in share mode;
排它鎖獲取方式:select * from account where name='jack' for update;