3. 併發的問題
4. 隔離級別
5. 總結
一系列資料庫操作的集合,主要就是 curd
乙個有規矩的團體,一起行走
事務像原子一樣不可分割
要麼全部成功,不會出現只有部分操作成功
要麼全部失敗,進行回滾,回到最初的狀態,好像什麼也沒發生過
操作們要同生共死
事務:小白給小黑轉賬
事務使資料庫從乙個一致性的狀態轉換到另乙個一致性的狀態
有點像物理學的質量守恆和能量守恆
佛系處事,雲卷雲舒,花開花落,大千世界不會因為我而改變
事務:小白和小黑轉賬
多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所干擾
多個併發事務之間要相互隔離
併發發生後,事務是可以同時訪問同一行資料的
事務又是孤僻的,我過我的獨木橋,你走你的陽關道
三個人轉賬:
事務一旦移交,對資料的改變是永久性的
發生故障不應該有任何影響
做了什麼就是什麼,已經刻入我的人生,無法逆轉
事務:小白給小黑轉賬
事務應該是互不來往,大家各走各路
現實情況是總有資源是交錯的
比如兩個事務一起執行時,同時又有對同一行資料由讀寫操作
難以避免的衝突發生了
會有四種形式出現
乙個事務把另乙個事務的更新覆蓋
小白和小黑給小紅轉賬
乙個事務讀取了另乙個事務未提交的資料
資料還沒提交,允許其他事務讀取
未提交的事務回滾會發生異常
小白和小黑給小紅轉賬
乙個事務讀取表中某一行資料,多次讀取的結果不同
因為在讀的時候,還允許其他事務修改資料
小紅在查自己賬戶,小白的轉賬
如果以最後讀到的資料為準,也有個隱患,也就是事務1發生回滾,那麼這個資料也是錯的
乙個事務讀取了別的事務插入的資料,導致前後讀取不一致
發生在事務讀取乙個指定範圍內的資料
事務讀取的期間,剛好有其他事務進行插入資料的操作,而且這個操作的值剛好就發生在這個指定範圍內
那麼就像幻覺一樣,見鬼了,兩次讀取的資料不一致
小黃在查金額為 100 的賬戶
針對事務併發出現的幾種問題,衍生出 4 種程度不一的隔離級別
對一行資料的操作,總體上可以認為是兩種
既然對同一行的資料的讀寫,會發生爭端,那麼就來立幾個規矩
乙個事務對一行資料的修改過程中
最低級別的隔離
只解決了更新丟失的問題,髒讀、不可重複讀、幻讀均會發生
乙個事務對一行資料的操作:
因為修改操作,其他事務無法訪問,就沒有了讀取未提交資料產生髒資料的情況發生
但是讀取操作,其他事務可能會修改該行,所以會發生不可重複讀問題,比如幾次讀取資料都不一樣
幻讀和插入新資料有關,也沒有解決
乙個事務對一行資料的操作:
可以看到在讀已提交的隔離級別上又進了一步,
修改資料和讀已提交是一樣的,所以不會有髒資料
讀取操作,禁止其他事務進行修改,也就不會出現多次讀取不一樣的資料,不可重複讀解決了
perfect!
但是插入新行呢,幻讀還是有的
幻讀問題和讀寫一行資料無關,和插入新資料有關,所以一些儲存引擎採取了其他方式來避免幻讀問題
比如 innodb 和 falcon 儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決該問題
所有事務序列執行
因為沒有了對同一行資料的同時操作
所以髒讀、不可重複讀不會發生
又連插入資料的事務也跟著排隊,幻讀同樣不會發生
效率太低了
這四種隔離級別可以用一張**來表示:
髒讀不可重複讀
幻讀未提交讀(read uncommitted)√√
√已提交讀(read committed)×√
√可重複讀(repeatable read)××
√可序列化(serializable)××
×大部分資料庫使用 read committed 的隔離級別
mysql 預設使用 repectable read 隔離級別
原來「事務0丟失」是這樣做到的
隨著資料上雲程序的加快,越來越多企業願意把雲下資料庫搬到雲上,同時對雲上資料庫的要求也越來越高。尤其是資料的完整可靠,承載著企業業務持續發展的使命,其重要性不言而喻。而企業在雲上使用過程中,事務經常面臨丟失的風險,可靠性和完整性得不到滿足,很大程度上影響了企業的業務發展。針對這個問題,華為雲資料庫m...
理解MySQL InnoDB事務隔離級別
本文為翻譯的文章,作者ovais.tariq,原文 隔離性是acid性質中很重要的部分,它保證事務以一種可靠的方式進行處理。隔離性確保同時執行的事務不會相互干擾。隔離性保證資料的一致性。如果事務沒有被隔離,那麼某個事務可能會修改其它事務正在讀取的資料,因而產生了資料的不一致。既然我們理解了隔離性是什...
事務隔離級別的理解
資料庫事務的隔離級別有4種,由低到高分別為read uncommitted read committed repeatable read serializable 而且,在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。下面通過事例一一闡述它們的概念與聯絡。read uncommitted 讀未提...