tft每日頭條

 > 職場

 > 數據庫事務的隔離級别是什麼

數據庫事務的隔離級别是什麼

職場 更新时间:2025-04-01 23:53:38

  張哥是某傳統通訊公司的程序員,去年由于疫情的影響公司效益不好,收入降了一大截,房貸、車貸和孩子的奶粉錢壓得他喘不過氣來,這不到了金三銀四的季節,張哥萌生了想要跳槽的想法,投了很多的企業,收到的面試機會也不少,但是每次聊完技術,面試官都是很客氣的告訴張哥:今天的面試就到這裡結果HR會通知你的。

  張哥很是苦惱,與我聊天的時候:說自己這些年光CRUD了,根本沒有學習過其他的知識。他還告訴我一個消息:最近的面試,面試官死抓着數據庫不放。這不昨天,面試官讓張哥舉例說下數據庫的事務隔離級别的作用,他沒答上來,所以又涼了。

  正好自己最近也在備戰,分享一下自己對數據庫事務隔離級别的理解

  什麼是事務 數據庫事務( transaction)是訪問并可能操作各種數據項的一個數據庫操作序列,這些操作要麼全部執行,要麼全部不執行,是一個不可分割的工作單位。事務由事務開始與事務結束之間執行的全部數據庫操作組成。

  通俗點來講:就是我們執行的一系列SQL語句,如果在同一個事物中,要麼全部執行成功,要麼全部執行失敗,不會存在部分執行成功,部分執行失敗并且數據保存到磁盤上之後,就不會再丢失了

  數據庫事務的特性 數據庫的事務

  1、原子性(Atomicity):事務中的全部操作在數據庫中是不可分割的,要麼全部完成,要麼全部不執行。

  2、一緻性(Consistency):幾個并行執行的事務,其執行結果必須與按某一順序 串行執行的結果相一緻。

  3、隔離性(Isolation):事務的執行不受其他事務的幹擾,事務執行的中間結果對其他事務必須是透明的。

  4、持久性(Durability):對于任意已提交事務,系統必須保證該事務對數據庫的改變不被丢失,即使數據庫出現故障。

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(1)

  四大事務隔離級别 在講事務隔離級别前:我想先講一下事務并發帶來的問題

  髒讀 數據庫有兩個事務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的客戶端并查看其事務隔離級别,如下圖:

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(2)

  默認的事物隔離級别

  1、驗證髒讀

  先設置兩個事物的隔離級别為 read-uncommitted;

  set session transaction isolation level read uncommitted;

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(3)

  設置讀未提交事物隔離級别

  事物A:将數據修改為1000

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(4)

  事務A修改值

  事物B:将數據改為800,但是事務B沒有提交

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(5)

  事務B修改數據

  此時事務A讀取到了事務B修改後的值

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(6)

  事務A讀取最新的數據

  此時如果事務B回滾了,事務A讀取到的就是髒數據。

  2、驗證不可重複讀

  先設置事務隔離級别為read committed;

  set session transaction isolation level read committed;

  事務B:第一次修改數據,未提交事務

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(7)

  事務A:第一次讀取數據,未讀取到事務B修改的數據,解決了髒讀問題

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(8)

  事務B:提交事務

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(9)

  事務A:第二次讀取數據,讀取到了事務B提交數據

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(10)

  事務B:重新開啟事務,第二次修改數據,并提交數據

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(11)

  事務A:再次讀取數據,發現同一個事物内,兩次讀取的數據是不一樣的,這就是不可重複讀

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(12)

  3、驗證幻讀

  開啟兩個事物,将事物的隔離級别設置為:repeatable-read(mysql默認的隔離級别)

  事物A:第一次讀取的數據

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(13)

  事物B:第一次修改數據

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(14)

  事物A:第二次讀取數據

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(15)

  事物B:第二次修改數據

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(16)

  事物A:第三次讀取數據,

  數據庫事務的隔離級别是什麼(舉例講講數據庫的事務隔離級别)(17)

  因此我們可以看到解決了不可重複度的問題

  總結 數據庫的事務隔離級别分為四種,不同的隔離級别可以解決不同的事務并發問題,同時更高的隔離級别會損失更多的性能,因此我們在實際使用的時候,要根據自身的業務場景來選擇合适的隔離級别。

  [機智]希望大家新的一年都能漲薪,實現人生理想。[機智]

  ,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关職場资讯推荐

热门職場资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved