資料庫(1)事物和事物的隔離等級

2021-08-20 22:51:56 字數 1773 閱讀 7644

這一段時間一直在學習關係型資料庫,準備寫乙個小專題來總結一下這一段時間的學習結果。

原子性(atomatic):資料庫事物包含的操作需要全部成功,否則進行回滾操作。

一致性(consistency):資料得操作前後要保持一致,不會出現預期之外的改變。

隔離性(isolation):隔離性是只多個使用者併發訪問同一資料時,資料庫為不同使用者開啟的事物不會被其他事物干擾,當然隔離性又分為不同的隔離等級。

永續性(durability):事物一旦提交,事物修改的資料對於資料庫來說是永久的。

對於事物的原子性,一致性和永續性,資料庫管理系統都是通過事物日誌系統來完成的。

對於事物的隔離性,資料庫管理系統一般通過鎖和mvcc機制來完成。

在sql標準中,事物隔離等級分為四種,而不同的dbms雖然對四種隔離等級實現不同,但都滿足了sql標準。

要注意的一點事,事物的隔離等級主要針對於事物中的讀操作(select語句),而對於資料的插入(insert),刪除(delete)和更新(update)操作,任何隔離等級下都不能同時操作。

讀未提交(read uncommitted):這種隔離等級下,資料庫不會進行任何加鎖和資料版本控制操作,在事物a中進行了修改資料,還沒有提交到資料庫時,事物b可以讀到這個修改。

讀已提交(read committed):這種隔離等級下,乙個事物只能讀到已經提交的事物進行的資料修改。可重複讀(repeatable read):這種隔離等級下,乙個事物多次讀的資料必須是一致的,也就是說第一次select讀取的資料就是以後全部select讀取的資料。

序列化(serializable):這種隔離等級下,資料庫會保證全部是讀寫操作都是完全序列的,乙個事物操作乙個資料時(無論讀寫操作),其他事物都不能再對這個資料進行寫操作。

sql標準中還給出了幾種常見的併發出現的問題:

髒讀:髒讀是指乙個事物處理過程中讀取了另乙個事物未提交的資料。不可重複讀:不可重複讀是指乙個事物中,多次查詢同一行,卻返回了不同的結果,因為這行被其他事物修改並提交了。

幻讀:幻讀是指事物a對資料進行了修改,而事物b此時新增了一條滿足事物a中修改條件的資料,而此時事物a沒辦法修改這條新插入的資料,事物a再去檢視修改後的資料,發現存在沒有修改的資料,就像出現了幻覺一樣。

根據sql標準中規定的事物隔離等級和事物併發操作中會出現的問題,我們可以得出如下結論。

分析:對於read uncommitted級別,因為可以讀取未提交的資料,所以會出現髒讀,不可重複讀和幻讀。

對於read committed級別,因為只能讀取事物提交以後的資料,所以避免了髒讀,但是依舊存在不可重複讀和幻讀情況。

對於repeatable read級別,因為限定了所有讀操作只能讀到一致的資料,所以避免了不可重複讀,但是因為還是可以隨意插入資料,所以幻讀情況依舊存在。

對於serialazable級別,因為所有的對同一資料操作的事物都序列化,所以避免了所有問題。

這裡要指出的是mysql在repeatable read級別就避免了幻讀的情況,是因為mysql特殊的mvcc機制和next-key lock機制的實現,這點網上很多互相抄襲的部落格都說錯了。

資料庫事物 隔離等級及資料庫鎖機制

事務 transaction 是資料庫管理系統的執行單位,可以是乙個資料庫操作 如select操作 或者是一組操作序列。事務acid屬性,即原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 原子性 atomic 保證事務中的所有操作...

資料庫事物隔離級別

資料庫事物的隔離級別有4個,由低到高依次為 1.read uncommitted 兩個併發的事務,事務b讀取了事物a尚未提交的資料,出現髒讀。2.read committed 事務a事先讀取了資料,事務b緊接更新了資料,並提交了事務,而事務a再次讀取該資料時,資料已發生了改變,即所說的不可重複讀。3...

資料庫事物隔離級別

事物隔離級別 1 序列化 serializable 單位時間,只有乙個事物,強制事物排序,並行度低,效能差 2 可重複讀 repeatable read 讀操作可以並行,同乙個事物裡,所有讀操作的結果都是事物開始時的狀態 一致性 但可以增加新的記錄,mysql 預設事物隔離級別 3 讀已提交 rea...