資料庫的隔離級別

2021-09-06 05:58:34 字數 2587 閱讀 2434

資料庫隔離級別

資料庫隔離級別資料庫提供了四種事務隔離級別, 不同的隔離級別採用不同的鎖類開來實現

.在四種隔離級別中

,serializable

的級別最高

, readuncommited

級別最低

.大多數資料庫的預設隔離級別為

: read commited,

如sql server , oracle.

少數資料庫預設的隔離級別為

repeatable read,

如mysql innodb

儲存引擎即使是最低的級別

,也不會出現

第一類丟失

更新問題.

mysql中

select @@tx_isolation可以檢視隔離級別

更改: set transaction isolation level read uncommitted;

isolation_read_uncommitted: 這是事務最低的隔離級別,它充許令外乙個事務可以看到這個事務未提交的資料。這種隔離級別會產生髒讀,不可重複讀和幻像讀。

isolation_read_committed: 保證乙個事務修改的資料提交後才能被另外乙個事務讀取。另外乙個事務不能讀取該事務未提交的資料

isolation_repeatable_read: 這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。它除了保證乙個事務不能讀取另乙個事務未提交的資料外,還保證了避免下面的情況產生(不可重複讀)

isolation_serializable 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。 除了防止髒讀,不可重複讀外,還避免了幻像讀。     

read uncommited :讀未提交資料(會出現髒讀,不可重複讀,幻讀,避免了第一類丟失更新)

read commited   :讀已提交的資料(會出現不可重複讀,幻讀)

repeatable read :

可重複讀(會出現幻讀

)serializable    :序列化 

隔離級別

是否存在髒讀

是否存在不可重複讀

是否存在幻讀

read uncommited y

y yread commited n

y yrepeatable read n

n yserializable n

nn丟失更新

當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。例:

事務a和事務b

同時修改某行的值,

1.事務

a將數值改為

1並提交

2.事務

b將數值改為

2並提交。

這時資料的值為

2,事務

a所做的更新將會丟失。

解決辦法:對行加鎖,只允許併發乙個更新事務。髒讀:

乙個事務讀到另乙個事務未提交的更新資料例

:1.mary

的原工資為

1000,

財務人員將

mary

的工資改為了

8000(

但未提交事務

)       

2.mary

讀取自己的工資

,發現自己的工資變為了

8000

,歡天喜地!

3.而財務發現操作有誤,回滾了事務

,mary

的工資又變為了

1000,

像這樣,mary

記取的工資數

8000

是乙個髒資料。

不可重複讀

:在同乙個事務中

,多次讀取同一資料

,返回的結果有所不同

.換句話說就是

,後續讀取可以讀到另乙個事務已提交的更新資料.相反

"可重複讀

"在同一事務多次讀取資料時

,能夠保證所讀資料一樣

,也就是後續讀取不能讀到另一事務已提交的更新資料.例

:1.在事務1

中,mary

讀取了自己的工資為

1000,

操作並沒有完成

2.在事務

2中,這時財務人員修改了

mary

的工資為

2000,

並提交了事務.3.

在事務1

中,mary

再次讀取自己的工資時,工資變為了

2000

解決辦法:如果只有在修改事務完全提交之後才可以讀取資料,則可以避免該問題。幻讀:

乙個事務讀取到另乙個事務已提交的

insert資料.

例:第乙個事務對乙個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時

(此時第一事務還未提交

),第二個事務向表中插入一行新資料。這時第乙個事務再去讀取表時

,發現表中還有沒有修改的資料行,就好象發生了幻覺一樣

資料庫隔離級別

read uncommited 讀未提交 最低級別,可讀取未提交事物的資料,這會導致髒讀,比如 某時刻會話a修改了乙個資料,但還未提交,此時會話b,讀取了該資料,這是,會話a回滾了事物,這就導致資料出現了不一致狀態,這就是髒讀 read commited 提交讀 避免了髒讀,但會導致不可重複讀,例如...

資料庫隔離級別

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

資料庫隔離級別

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