怎麼理解SQL的四個事務隔離級別?

2021-08-23 14:03:03 字數 1292 閱讀 4544

事務的隔離級別是為了解決併發問題。那麼先來了解下併發帶來的問題:

1)丟失更新 lost update:(沒有加鎖)

兩個事務同時更新一行資料,最後乙個事務的更新會覆蓋掉第乙個事務的更新,從而導致第乙個事務更新的資料丟失,這是由於沒有加鎖造成的。

2)髒讀dirty reads:(沒有隔離)

乙個事務看到了另外乙個事物沒有提交的更新資料。這是事務沒有隔離造成的。

3)不可重複讀:non-repeatable reads

在同一事務中,多次讀取同一資料但是返回不同的結果,也就是有其他事務更改了這些資料。

4)幻讀:phantom reads 併發造成的

乙個事務在執行過程中讀取到另乙個事務已提交的插入資料。就是說在第乙個事務開始時,讀取到一批資料,但是伺候另乙個事務又插入新資料並提交,此時第乙個事務又讀取到這批資料但是發現多出了一條,貌似產生幻覺一樣。這是併發造成的。

接下來我們說說這四個隔離級別,

1)未提交讀(read uncommitted):乙個事務能夠讀取到 別的事務中沒有提交的更新資料。事務可以讀取到未提交的資料,這也被稱為髒讀(dirty read)。

所以這種級別很有可能讀到髒資料,隔離級別最低。

2)提交讀(read committed):乙個事務只能讀取到別的事務提交的更新資料。

一般我們提交讀就可以了。只能讀取到已經提交的資料。即解決了髒讀,但未解決不可重複讀。(oracle預設的)

3)可重複讀(repeated read):保證同一事務中先後執行的多次查詢將返回同意結果,不受其他事務的影響。這種隔離級別可能出現幻讀。(mysql預設的)

4)序列化(serializable):不允許事務併發執行,強制事務序列執行,就是在讀取的每一行資料上都加上了鎖,讀寫相互都會阻塞。這種隔離級別最高,是最安全的,效能最低,不會出現髒讀,不可重複讀,幻讀,丟失更新。

那麼怎麼設定隔離級別呢

set transaction isolation level read committed; //設定提交讀隔離級別

set transaction isolation level serializable; //設定序列化隔離級別

以上請參考。

怎麼理解SQL的四個事務隔離級別?

事務的隔離級別是為了解決併發問題。那麼先來了解下併發帶來的問題 1 丟失更新 lost update 沒有加鎖 兩個事務同時更新一行資料,最後乙個事務的更新會覆蓋掉第乙個事務的更新,從而導致第乙個事務更新的資料丟失,這是由於沒有加鎖造成的。2 髒讀dirty reads 沒有隔離 乙個事務看到了另外...

Js SQL 事務的四個隔離級別

事務的四個隔離級別 4個 read uncommitted 讀未提交 read committed 讀已提交 repeatable read 可重複讀 serializable 序列化 read uncommitted 讀未提交 事務a和事務b,事務a未提交的資料,事務b可以讀取到,這裡讀到的資料可...

標準SQL規範中定義的四個事務隔離級別

在標準sql規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同 未授權讀取 read uncommitted 允許髒讀取,但不允許更新丟失。如果乙個事務已經開始寫資料,則另外乙個資料則不允許同時進行寫操作,但允許其他事務讀此行資料。該隔離級別可以通過 排他寫鎖 實現。授權讀取 read ...