資料庫事務,隔離級別

2021-08-07 09:10:05 字數 872 閱讀 4132

事務的四個性質:

然而,通常來說,我們需要適當的犧牲隔離性這個屬性,來換取併發度,這是必須的。當然這就帶來了不同的資料庫隔離級別以及併發控制的問題。

併發帶來的問題:

可以採取的隔離級別:

最不該出現的情況,事物之間是完全透明的,乙個事務改變了某個字段但是還沒有提交,其他事務就可以讀到了這個欄位的最新值。我們想象乙個場景,事務a準備存錢,餘額本來是1000塊,剛要查的時候,事務b開始執行了,事務b取出了1000元,此時執行緒分配到了事務a,進行查詢,查到了0塊,此時事務b出現問題,回滾,餘額又變成了1000,然後事務a存錢500元,進行操作 0+500=500,接著改變餘額的值:500,提交事務。最終餘額變成了500,這顯然是必須避免發生的。

即我們需要限定,乙個事務提交前所改變的東西,對其他事務是不可見的,也就是只要你不提交,你所做出的改變別的事務是看不到的,別的事務讀到的肯定是老資料。對應了資料庫的隔離級別:read_committed,這個級別的隔離不允許髒讀的發生,而允許了後兩者的發生。這也是大多數資料庫的預設隔離級別,不過mysql不是。

雖然上面這種隔離級別避免了髒讀,隨之而來的他也帶來了一種新的問題:不可重複讀,在乙個事務的過程中讀取同乙個欄位你可能得到不同的值,想要避免這種情況,對應的隔離級別就是repeatable_read,這是mysql的預設級別。

而所謂的幻讀跟不可重複讀很像,簡單的可以理解為事務 a 讀取了事務 b 已提交的新增資料。對應了serializable的隔離級別,這個隔離級別就完全是序列化了,將會極大的降低效能。

併發控制

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted re...