張哥是某傳統通訊公司的程序員,去年由于疫情的影響公司效益不好,收入降了一大截,房貸、車貸和孩子的奶粉錢壓得他喘不過氣來,這不到了金三銀四的季節,張哥萌生了想要跳槽的想法,投了很多的企業,收到的面試機會也不少,但是每次聊完技術,面試官都是很客氣的告訴張哥:今天的面試就到這裡,結果HR會通知你的。
張哥很是苦惱,與我聊天的時候:說自己這些年光CRUD了,根本沒有學習過其他的知識。他還告訴我一個消息:最近的面試,面試官死抓着數據庫不放。這不昨天,面試官讓張哥舉例說下數據庫的事務隔離級别的作用,他沒答上來,所以又涼了。
正好自己最近也在備戰,分享一下自己對數據庫事務隔離級别的理解
什麼是事務 數據庫事務( transaction)是訪問并可能操作各種數據項的一個數據庫操作序列,這些操作要麼全部執行,要麼全部不執行,是一個不可分割的工作單位。事務由事務開始與事務結束之間執行的全部數據庫操作組成。
通俗點來講:就是我們執行的一系列SQL語句,如果在同一個事物中,要麼全部執行成功,要麼全部執行失敗,不會存在部分執行成功,部分執行失敗。并且數據保存到磁盤上之後,就不會再丢失了
數據庫事務的特性 數據庫的事務
1、原子性(Atomicity):事務中的全部操作在數據庫中是不可分割的,要麼全部完成,要麼全部不執行。
2、一緻性(Consistency):幾個并行執行的事務,其執行結果必須與按某一順序 串行執行的結果相一緻。
3、隔離性(Isolation):事務的執行不受其他事務的幹擾,事務執行的中間結果對其他事務必須是透明的。
4、持久性(Durability):對于任意已提交事務,系統必須保證該事務對數據庫的改變不被丢失,即使數據庫出現故障。
四大事務隔離級别 在講事務隔離級别前:我想先講一下事務并發帶來的問題
髒讀 數據庫有兩個事務A、B,髒讀是指事物A讀取到事物B未提交事物的數據,當事物B回滾後,事物A拿到的數據就是髒數據。不可重複讀 數據庫有兩個事務A、B,不可重複讀是指事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新并提交,導緻事務A多次讀取同一數據時,結果 不一緻幻讀 系統管理員A将數據庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。
事務隔離級别 | 髒讀 | 不可重複讀 | 幻讀 |
讀取-未提交(read-uncommitted) | 是 | 是 | 是 |
讀取-已提交(read-committed) | 否 | 是 | 是 |
可重複讀(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
示例帶你了解隔離級别的作用 開啟事務的語句:start transaction;
首先我們先打開兩個MySQL的客戶端并查看其事務隔離級别,如下圖:
默認的事物隔離級别
1、驗證髒讀
先設置兩個事物的隔離級别為 read-uncommitted;
set session transaction isolation level read uncommitted;
設置讀未提交事物隔離級别
事物A:将數據修改為1000
事務A修改值
事物B:将數據改為800,但是事務B沒有提交
事務B修改數據
此時事務A讀取到了事務B修改後的值
事務A讀取最新的數據
此時如果事務B回滾了,事務A讀取到的就是髒數據。
2、驗證不可重複讀
先設置事務隔離級别為read committed;
set session transaction isolation level read committed;
事務B:第一次修改數據,未提交事務
事務A:第一次讀取數據,未讀取到事務B修改的數據,解決了髒讀問題
事務B:提交事務
事務A:第二次讀取數據,讀取到了事務B提交數據
事務B:重新開啟事務,第二次修改數據,并提交數據
事務A:再次讀取數據,發現同一個事物内,兩次讀取的數據是不一樣的,這就是不可重複讀
3、驗證幻讀
開啟兩個事物,将事物的隔離級别設置為:repeatable-read(mysql默認的隔離級别)
事物A:第一次讀取的數據
事物B:第一次修改數據
事物A:第二次讀取數據
事物B:第二次修改數據
事物A:第三次讀取數據,
因此我們可以看到解決了不可重複度的問題
總結 數據庫的事務隔離級别分為四種,不同的隔離級别可以解決不同的事務并發問題,同時更高的隔離級别會損失更多的性能,因此我們在實際使用的時候,要根據自身的業務場景來選擇合适的隔離級别。
[機智]希望大家新的一年都能漲薪,實現人生理想。[機智]
,