mysql四種隔離級別知乎 資料庫四種隔離級別

2021-10-18 22:09:18 字數 804 閱讀 3378

未提交讀

未提交讀比較好理解,就是說即使乙個事務沒有提交,那麼它所做的資料修改對其它事務也是可見的。這種隔離級別是最低等級的隔離,它會導致事務可以讀取到髒資料,在實際應用中很少見。

提交讀/不可重複讀

和上面的相對應,只有當事務提交了,事務對資料的修改才會對其它事務可見。這種隔離級別被大多數資料庫系統作為預設的隔離級別。這種級別也會導致乙個問題,舉個例子,在乙個事務的**中有兩個select name from student where id=1;語句,那麼第一次執行的時候這個同學的名字可能是張三,第二次執行的時候名字變成李四了。這是因為兩次查詢之間可能有別的事務對name這個屬性做了修改。

可重複讀

這種隔離級別解決了上面同乙個語句得到不同結果的問題。一種可行的方案是對要查詢的列加鎖,讓其它事務無法修改要查詢的行。還是上面的例子,在第一次執行select name from student where id=1語句的時候,我們就把id=1的這一列鎖住,直到當前事務完成,這樣就可以重複讀到相同的結果了。但是這種讀取方式也有乙個問題,比如說執行select name from student where id>10;語句,假如當前id大於10的學生有兩個,當我們執行了一次這個語句之後,對這兩行加了鎖。但是另乙個事務仍然可以新增乙個id等於13的同學,這個時候第二次執行語句就會搜出三個同學,這種現象叫做幻象讀。

序列化讀

這種是最高的隔離級別,它強制事務對查詢/修改的表進行加鎖,這樣其它事務就無法對這個表中的資料進行修改,也就規避了幻象讀的風險。這種隔離級別雖然最安全,但是也有相應的代價,那就是它會導致鎖爭用的問題,而且嚴重降低了資料庫的併發程度,因此在實際應用中也不常見。

MySQL四種隔離級別

在sql標準中定義了四種隔離級別,每一種級別都規定了乙個事務中所做的修改,哪些是在事務內和事務間可見的,哪些是不可見的。較低階別的隔離通常可以執行更高的併發,系統的開銷也更低。未提交讀 read uncommitted 在未提交讀級別,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取...

mysql四種隔離級別

髒讀 dirty reads 乙個事務正在對一條記錄做修改,在這個事務完成並提交前,這條記錄的資料就處於不一致狀態 這時另乙個事務也來讀取同一條記錄,如果不加控制,第二個事務讀取了這些 髒 資料,並據此做進一步的處理,就會產生未提交的資料依賴關係。這種現象被形象地叫做 髒讀 第乙個事務可能會回滾,第...

Mysql四種隔離級別

什麼是事務?事務是應用程式中的一系列嚴密的操作,所有的操作必須成功完成,否則在每乙個操作中所有執行的更改都會撤銷。也就是事務具有原子性操作,乙個事務中的一系列操作,要麼全部成功,要麼全部都不做。事務的結束有兩種,當事務中的所有步驟全部執行成功時,事務提交。如果其中乙個步驟失敗,將會發生回滾操作,撤銷...