【概念原理】四种SQL事务隔离级别和事务ACID特性
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
? ? 事務(wù)是一組讀寫操作,并且具有只有所有操作都成功才算成功的特性。
事務(wù)隔離級別
? ? SQL事務(wù)隔離級別由弱到強(qiáng)分別是:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。
? ? 下表是這四種事務(wù)隔離級別對臟讀、不可重復(fù)讀和幻讀的支持情況:
| 隔離級別 | 臟讀(Dirty read) | 不可重復(fù)讀(Non-repeatable read) | 幻讀(Phantom read) |
| READ_UNCOMMITED | 允許 | 允許 | 允許 |
| READ_COMMITED | 不允許 | 允許 | 允許 |
| REPEATABLE_READ | 不允許 | 不允許 | 允許 |
| SERIALIZBLE | 不允許 | 不允許 | 不允許 |
? ? 臟讀:
? ? 臟讀指的是一個事務(wù)允許讀取其他正在運行的事務(wù)還沒有提交的改變。這種情況的發(fā)生主要因為沒有加鎖。
? ? 不可重復(fù)讀:
? ? 不可重復(fù)讀是指事務(wù)A讀取了事務(wù)B已經(jīng)提交的更改數(shù)據(jù)。不可重復(fù)讀指的是一個事務(wù)內(nèi)連續(xù)讀卻得到不同的結(jié)果,主要因為同時有其他事務(wù)更新了我們正在讀取的數(shù)據(jù)。要達(dá)到允許可重復(fù)讀的目的,我們必須讓當(dāng)前事務(wù)保持一個讀共享鎖。
? ? 幻讀:
? ? 幻讀指的是事務(wù)不是串行發(fā)生時發(fā)生的一種現(xiàn)象,是事務(wù)A讀取了事務(wù)B已提交的新增數(shù)據(jù)。例如第一個事務(wù)對一個表的所有數(shù)據(jù)進(jìn)行修改,同時第二個事務(wù)向表中插入一條新數(shù)據(jù)。那么操作第一個事務(wù)的用戶就發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就像發(fā)生了幻覺一樣。解決幻讀的方法是增加范圍鎖(range lock)或者表鎖。四種事務(wù)隔離級別中只有SERIALIZABLE能夠解決幻讀。
? ? MySQL的默認(rèn)事務(wù)隔離級別是REPEATABLE_READ,ORACLE、SQL Server、DB2和PostgreSQL的默認(rèn)事務(wù)隔離級別是READ_COMMITED。
事務(wù)ACID特性
? ? 事務(wù)的ACID特性分別指的是原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。
? ? 下面分別簡述:
? ? 原子性:將一組操作組合成原子操作,只有所有操作都成功才算成功,否則只要有一個操作失敗就全部失敗
? ? 一致性:事務(wù)必須保證系統(tǒng)處于一致性狀態(tài),不管事務(wù)如何交織并發(fā)執(zhí)行。必須保證下面幾條:
如果一個操作觸發(fā)了間接行為(CASCADE、TRIGGER等),那么間接行為也必須成功,否則事務(wù)失敗
如果一個系統(tǒng)包含多個數(shù)據(jù)節(jié)點,那么一致性強(qiáng)制要求修改必須傳播到所有節(jié)點
雖然事務(wù)可以并行執(zhí)行,但系統(tǒng)就好像在串行執(zhí)行事務(wù)一樣,即與串行執(zhí)行事務(wù)導(dǎo)致的最終系統(tǒng)狀態(tài)是一樣的
? ? 隔離性:隔離性保證一個事務(wù)中未提交的修改對外界不可見。隔離性通過鎖機(jī)制達(dá)到。
? ?持久性:一個成功的事務(wù)必須永久改變系統(tǒng)的狀態(tài),在事務(wù)執(zhí)行結(jié)束之前狀態(tài)改變被記錄在事務(wù)日志中。這樣萬一系統(tǒng)崩潰或斷電,未完成的事務(wù)也可以回放。
轉(zhuǎn)載于:https://my.oschina.net/feichexia/blog/202520
總結(jié)
以上是生活随笔為你收集整理的【概念原理】四种SQL事务隔离级别和事务ACID特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: grep,egrep及元字符和posix
- 下一篇: mysql锁等待问题