Mysql有四種事務隔離級別,默認的是可重復讀.
| 事務隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
| --- | --- | --- | --- |
| 讀未提交 | 是 | 是 | 是 |
| 讀已提交 | 否 | 是 | 是 |
| 可重復讀 | 否 | 否 | 是 |
| 串行 | 否 | 否 | 否 |
* 讀未提交(Read uncommitted)
一個事務可以讀取另一個未提交事務的數據,最低級別,任何情況都無法保證。
(1)所有事務都可以看到其他未提交事務的執行結果 (2)本隔離級別很少用于實際應用,因為它的性能也不比其他級別好多少 (3)該級別引發的問題是——臟讀(Dirty Read):讀取到了未提交的數據
* 讀已提交(Read committed)
一個事務要等另一個事務提交后才能讀取數據,可避免臟讀的發生。
(1)這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的) (2)它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變 (3)這種隔離級別出現的問題是——不可重復讀(Nonrepeatable Read),不可重復讀意味著我們在同一個事務中執行完全相同的select語句時可能看到不一樣的結果。
導致這種情況的原因可能有:
(1)有一個交叉的事務有新的commit,導致了數據的改變; (2)一個數據庫被多個實例操作時,同一事務的其他實例在該實例處理其間可能會有新的commit.
* 可重復讀(Repeatable read)
就是在開始讀取數據(事務開啟)時,不再允許修改操作,可避免臟讀、不可重復讀的發生。
(1)這是MySQL的默認事務隔離級別. (2)它確保同一事務的多個實例在并發讀取數據時,會看到同樣的數據行. (3)此級別可能出現的問題——幻讀(Phantom Read):當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影” 行. (4)InnoDB和Falcon存儲引擎通過多版本并發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題.InnoDB采用MVCC來支持高并發,實現了四個標準隔離級別。默認基本是可重復讀,并且提供間隙鎖(next-key locks)策略防止幻讀出現。
* 串行(Serializable)
串行(Serializable),是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。 但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。Mysql的默認隔離級別是Repeatable read。
(1)這是最高的隔離級別. (2)它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。 (3)在這個級別,可能導致大量的超時現象和鎖競爭.
# [什么是臟讀,不可重復讀,幻讀](http://www.cnblogs.com/phoebus0501/archive/2011/02/28/1966709.html)
**1.****臟讀**:臟讀就是指當一個事務正在訪問數據,并且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然后使用了這個數據。
**2.****不可重復讀**:是指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據。那么,在第一個事務中的兩 次讀數據之間,由于第二個事務的修改,那么第一個事務兩次讀到的的數據可能是不一樣的。這樣就發生了在一個事務內兩次讀到的數據是不一樣的,因此稱為是不 可重復讀。例如,一個編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當編輯人員第二次讀取文檔時,文檔已更改。原始讀取不可重復。如果 只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問題。
**3.****幻讀**: 是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。 同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那么,以后就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象 發生了幻覺一樣。例如,一個編輯人員更改作者提交的文檔,但當生產部門將其更改內容合并到該文檔的主復本時,發現作者已將未編輯的新材料添加到該文檔中。 如果在編輯人員和生產部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。
**補充 :**基于元數據的 Spring 聲明性事務 :
Isolation 屬性一共支持五種事務設置,具體介紹如下:
l????????? DEFAULT 使用數據庫設置的隔離級別 ( 默認 ) ,由 DBA 默認的設置來決定隔離級別 .
l????????? READ\_UNCOMMITTED 會出現臟讀、不可重復讀、幻讀 ( 隔離級別最低,并發性能高 )
l????????? READ\_COMMITTED? 會出現不可重復讀、幻讀問題(鎖定正在讀取的行)
l????????? REPEATABLE\_READ 會出幻讀(鎖定所讀取的所有行)
l????????? SERIALIZABLE 保證所有的情況不會發生(鎖表)
**不可重復讀的重點是修改****:**
同樣的條件 , ? 你讀取過的數據 , ? 再次讀取出來發現值不一樣了
**幻讀的重點在于新增或者刪除**
同樣的條件 , ? 第 1 次和第 2 次讀出來的記錄數不一樣
- Golang基礎
- Go中new與make的區別
- Golang中除了加Mutex鎖以外還有哪些方式安全讀寫共享變量
- 無緩沖Chan的發送和接收是否同步
- Golang并發機制以及它所使用的CSP并發模型.
- Golang中常用的并發模型
- Go中對nil的Slice和空Slice的處理是一致的嗎
- 協程和線程和進程的區別
- Golang的內存模型中為什么小對象多了會造成GC壓力
- Go中數據競爭問題怎么解決
- 什么是channel,為什么它可以做到線程安全
- Golang垃圾回收算法
- GC的觸發條件
- Go的GPM如何調度
- 并發編程概念是什么
- Go語言的棧空間管理是怎么樣的
- Goroutine和Channel的作用分別是什么
- 怎么查看Goroutine的數量
- Go中的鎖有哪些
- 怎么限制Goroutine的數量
- Channel是同步的還是異步的
- Goroutine和線程的區別
- Go的Struct能不能比較
- Go的defer原理是什么
- Go的select可以用于什么
- Context包的用途是什么
- Go主協程如何等其余協程完再操作
- Go的Slice如何擴容
- Go中的map如何實現順序讀取
- Go中CAS是怎么回事
- Go中的逃逸分析是什么
- Go值接收者和指針接收者的區別
- Go的對象在內存中是怎樣分配的
- 棧的內存是怎么分配的
- 堆內存管理怎么分配的
- 在Go函數中為什么會發生內存泄露
- G0的作用
- Go中的鎖如何實現
- Go中的channel的實現
- 棧的內存是怎么分配的2
- 堆內存管理怎么分配的2
- Go中的map的實現
- Go中的http包的實現原理
- Goroutine發生了泄漏如何檢測
- Go函數返回局部變量的指針是否安全
- Go中兩個Nil可能不相等嗎
- Goroutine和KernelThread之間是什么關系
- 為何GPM調度要有P
- 如何在goroutine執行一半就退出協程
- Mysql基礎
- Mysql索引用的是什么算法
- Mysql事務的基本要素
- Mysql的存儲引擎
- Mysql事務隔離級別
- Mysql高可用方案有哪些
- Mysql中utf8和utf8mb4區別
- Mysql中樂觀鎖和悲觀鎖區別
- Mysql索引主要是哪些
- Mysql聯合索引最左匹配原則
- 聚簇索引和非聚簇索引區別
- 如何查詢一個字段是否命中了索引
- Mysql中查詢數據什么情況下不會命中索引
- Mysql中的MVCC是什么
- Mvcc和Redolog和Undolog以及Binlog有什么不同
- Mysql讀寫分離以及主從同步
- InnoDB的關鍵特性
- Mysql如何保證一致性和持久性
- 為什么選擇B+樹作為索引結構
- InnoDB的行鎖模式
- 哈希(hash)比樹(tree)更快,索引結構為什么要設計成樹型
- 為什么索引的key長度不能太長
- Mysql的數據如何恢復到任意時間點
- Mysql為什么加了索引可以加快查詢
- Explain命令有什么用
- Redis基礎
- Redis的數據結構及使用場景
- Redis持久化的幾種方式
- Redis的LRU具體實現
- 單線程的Redis為什么快
- Redis的數據過期策略
- 如何解決Redis緩存雪崩問題
- 如何解決Redis緩存穿透問題
- Redis并發競爭key如何解決
- Redis的主從模式和哨兵模式和集群模式區別
- Redis有序集合zset底層怎么實現的
- 跳表的查詢過程是怎么樣的,查詢和插入的時間復雜度
- 網絡協議基礎
- TCP和UDP有什么區別
- TCP中三次握手和四次揮手
- TCP的LISTEN狀態是什么
- 常見的HTTP狀態碼有哪些
- 301和302有什么區別
- 504和500有什么區別
- HTTPS和HTTP有什么區別
- Quic有什么優點相比Http2
- Grpc的優缺點
- Get和Post區別
- Unicode和ASCII以及Utf8的區別
- Cookie與Session異同
- Client如何實現長連接
- Http1和Http2和Grpc之間的區別是什么
- Tcp中的拆包和粘包是怎么回事
- TFO的原理是什么
- TIME_WAIT的作用
- 網絡的性能指標有哪些