資料庫的隔離級別

2022-07-09 10:27:10 字數 2346 閱讀 8765

隔離級別:

分為:1.讀未提交;2.讀已提交;3.可重複讀;4.序列劃

資料庫會出現的問題:1.髒讀;2.不可重複讀;3.幻讀

不同隔離級別,能處理的問題不同:

那來看看下面一些概念:

髒讀:指的是乙個事務讀取到了另乙個事務未提交的更新資料:

===session1===

select @@tx_isolation;

set tx_isolation='read-uncommitted';

begin;

insert into students(`name`,age,teacherid) values ('takey123',25,1)

rollback;

commit;

===session2===

set tx_isolation='read-uncommitted';

select * from students

說明:事務1,設定隔離級別為讀未提交。然後開啟事務,insert一條記錄,但是不提交。

此時事務2,查詢到了所有資料,包釦事務1插入但是還沒提交的資料,假如做了sum()運算。這是事務1回滾事務。這樣就出問題了。事務2的資料並不是準確的。

為了避免這種情況,只能設定更高的隔離級別

不可重複讀:乙個事務多次讀取同一資料返回的結果不同,換句話說,後續讀取可以讀到另乙個事務已提交的更新資料。

相反, 「可重複讀」在同一事務中多次讀取資料時, 能夠保證所讀資料一樣, 也就是後續讀取不能讀到另一事務已提交的更新資料。

事務b修改資料導致當前事務a前後讀取資料不一致 ,側重點在於事務b的修改

===session1===

select @@tx_isolation;

set tx_isolation='read-committed';

begin;

select * from students

select * from students

commit;

===session2===

set tx_isolation='read-committed';

update students set age=25 where `name`='min';

說明:事務1第一次讀取資料表,獲取學生的年齡是25歲。此時事務2對該學生的年齡修改為40並提交。

事務1第二次讀取資料表,獲取學生的年齡是40歲。這就出現了同一事務多次讀取到的資料不一致,導致不可重複讀。

幻讀:查詢表中資料如果沒有存在就插入一條資料。在併發的時候,裡面會出現2條一樣的資料。

事務a在查詢資料庫是,發現沒有此資料,就去插入一條資料,但是此時事務b也是查詢不到資料去插入一條資料並插入成功了。

如果事務a此時再去查的時候,發現了有這條資料,就感覺出現了幻覺,明明自己還沒插入,但是又出現了這條資料。

===session1===

select @@tx_isolation;

set tx_isolation='repeatable-read';

begin;

select * from students where `name`='takey123';

#此時,另乙個事務插入了資料

select * from students where `name`='takey123';

insert into students(`name`,age,teacherid) values ('takey123',25,1)

select * from students where `name`='takey123';

update students set age=40 where `name`='takey123';

select * from students where `name`='takey123';

commit;

===session2===

set tx_isolation='repeatable-read';

insert into students(`name`,age,teacherid) values ('takey123',25,1)

說明:事務1,插入資料庫中是否存在資料,如果不存在的時候去插入這條資料,但是在查詢不存在的時候,事務2,插入了該條資料,

事務1也插入該條資料,導致資料庫中有2條一模一樣的資料。這就產生了幻讀。

事務在什麼時候不起作用呢:

1.bean是否是**物件,如果不是**物件,就不起作用。

2.入口函式是否是public的。

資料庫隔離級別

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...