事務的四種隔離級別

2022-02-16 04:21:16 字數 1675 閱讀 5442

資料庫事務的隔離級別有4種,由低到高分別為read uncommitted 、read committed 、repeatable read 、serializable 。而且,在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。下面通過事例一一闡述它們的概念與聯絡。

read uncommitted

讀未提交,顧名思義,就是乙個事務可以讀取另乙個未提交事務的資料。

事例:老闆要給程式設計師發工資,程式設計師的工資是3.6萬/月。但是發工資時老闆不小心按錯了數字,按成3.9萬/月,該錢已經打到程式設計師的戶口,但是事務還沒有提交,就在這時,程式設計師去檢視自己這個月的工資,發現比往常多了3千元,以為漲工資了非常高興。但是老闆及時發現了不對,馬上回滾差點就提交了的事務,將數字改成3.6萬再提交。

分析:實際程式設計師這個月的工資還是3.6萬,但是程式設計師看到的是3.9萬。他看到的是老闆還沒提交事務時的資料。這就是髒讀。

那怎麼解決髒讀呢?read committed!讀提交,能解決髒讀問題。

read committed

讀提交,顧名思義,就是乙個事務要等另乙個事務提交後才能讀取資料。

事例:程式設計師拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(程式設計師事務開啟),收費系統事先檢測到他的卡里有3.6萬,就在這個時候!!程式設計師的妻子要把錢全部轉出充當家用,並提交。當收費系統準備扣款時,再檢測卡里的金額,發現已經沒錢了(第二次檢測金額當然要等待妻子轉出金額事務提交完)。程式設計師就會很鬱悶,明明卡里是有錢的…

分析:這就是讀提交,若有事務對資料進行更新(update)操作時,讀操作事務要等待這個更新操作事務提交後才能讀取資料,可以解決髒讀問題。但在這個事例中,出現了乙個事務範圍內兩個相同的查詢卻返回了不同資料,這就是不可重複讀。

那怎麼解決可能的不可重複讀問題?repeatable read !

repeatable read

重複讀,就是在開始讀取資料(事務開啟)時,不再允許修改操作

事例:程式設計師拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(事務開啟,不允許其他事務的update修改操作),收費系統事先檢測到他的卡里有3.6萬。這個時候他的妻子不能轉出金額了。接下來收費系統就可以扣款了。

分析:重複讀可以解決不可重複讀問題。寫到這裡,應該明白的一點就是,不可重複讀對應的是修改,即update操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入insert操作,而不是update操作。

什麼時候會出現幻讀?

事例:程式設計師某一天去消費,花了2千元,然後他的妻子去檢視他今天的消費記錄(全表掃瞄fts,妻子事務開啟),看到確實是花了2千元,就在這個時候,程式設計師花了1萬買了一部電腦,即新增insert了一條消費記錄,並提交。當妻子列印程式設計師的消費記錄清單時(妻子事務提交),發現花了1.2萬元,似乎出現了幻覺,這就是幻讀。

那怎麼解決幻讀問題?serializable!

serializable 序列化

serializable 是最高的事務隔離級別,在該級別下,事務序列化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。

值得一提的是:大多數資料庫預設的事務隔離級別是read committed,比如sql server , oracle。mysql的預設隔離級別是repeatable read。

事務四種隔離級別

1.讀取未提交 乙個事務可以讀取另乙個未提交的事務的資料。髒讀 2.讀取已提交 事務a多次讀取同一資料,事務b在事務a多次讀取的過程中,對資料做了更新並提交,導致事務a多次讀取同一資料時,結果不一致。不可重複度 對應update操作 3.可重複讀 開始讀取資料時 事務開啟時 不在允許修改操作。可能會...

四種事務的隔離級別

sql 標準定義的四個隔離級別為 read uncommitted 未提交讀 read committed 提交讀 repeatable read 可重複讀 serializable 可序列化 下面分別介紹。1 未提交讀 就是乙個事務可以讀取另乙個未提交事務的資料。1 開啟乙個客戶端a,並設定當前事...

事務的四種隔離級別

資料庫事務的隔離級別有4種,由低到高分別為read uncommitted read committed repeatable read serializable 在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。具體可參照該篇部落格 read uncommitted 讀未提交,即乙個事務可以讀取...