mysql中什麼是事務概念 一文搞懂什麼是事務

2021-10-18 21:48:50 字數 3147 閱讀 4351

一文搞懂什麼是事務

事務概念

我們要理解下事務概念: 什麼是事務呢?事務是併發控制的單位,是使用者定義的乙個操作序列。有四個特性(acid):原子性(atomicity): 事務是資料庫的邏輯工作單位,事務中包括的諸操作要麼全做,要麼全不做。

隔離性(isolation): 乙個事務的執行不能被其他事務干擾。

持續性/永久性(durability): 乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。

以上是書面解釋,簡單來說就是把你的操作統一化,要麼所有操作都成功,要麼就都不成功,如果執行中有某一項操作失敗,其之前所有的操作都回滾到未執行這一系列操作之前的狀態。

髒讀、不可重複讀、幻讀

先理解這三種由於併發訪問導致的資料讀取問題,再理解事務隔離級別就簡單多了。

髒讀a事務讀取b事務尚未提交的資料,此時如果b事務發生錯誤並執行回滾操作,那麼a事務讀取到的資料就是髒資料。就好像原本的資料比較乾淨、純粹,此時由於b事務更改了它,這個資料變得不再純粹。這個時候a事務立即讀取了這個髒資料,但事務b良心發現,又用回滾把資料恢復成原來乾淨、純粹的樣子,而事務a卻什麼都不知道,最終結果就是事務a讀取了此次的髒資料,稱為髒讀。

這種情況常發生於轉賬與取款操作中

不可重複讀(前後多次讀取,資料內容不一致)

事務a在執行讀取操作,由整個事務a比較大,前後讀取同一條資料需要經歷很長的時間 。而在事務a第一次讀取資料,比如此時讀取了小明的年齡為20歲,事務b執行更改操作,將小明的年齡更改為30歲,此時事務a第二次讀取到小明的年齡時,發現其年齡是30歲,和之前的資料不一樣了,也就是資料不重複了,系統不可以讀取到重複的資料,成為不可重複讀。

幻讀(前後多次讀取,資料總量不一致)

事務a在執行讀取操作,需要兩次統計資料的總量,前一次查詢資料總量後,此時事務b執行了新增資料的操作並提交後,這個時候事務a讀取的資料總量和之前統計的不一樣,就像產生了幻覺一樣,平白無故的多了幾條資料,成為幻讀。

小總結:不可重複讀和幻讀到底有什麼區別?

(1) 不可重複讀是讀取了其他事務更改的資料,針對update操作

解決:使用行級鎖,鎖定該行,事務a多次讀取操作完成後才釋放該鎖,這個時候才允許其他事務更改剛才的資料。

(2) 幻讀是讀取了其他事務新增的資料,針對insert和delete操作

解決:使用表級鎖,鎖定整張表,事務a多次讀取資料總量之後才釋放該鎖,這個時候才允許其他事務新增資料。這時候再理解事務隔離級別就簡單多了呢。

資料庫事務的隔離級別

sql 標準定義的四種隔離級別被 ansi(美國國家標準學會)和 iso/iec(國際標準)採用,每種級別對事務的處理能力會有不同程度的影響。事務是一系列的動作,它們綜合在一起才是乙個完整的工作單元,這些動作必須全部完成,如果有乙個失敗的話,那麼事務就會回滾到最開始的狀態,彷彿什麼都沒發生過一樣。

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted 、read committed 、repeatable read 、serializable ,這四個級別可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。

預設值,表示使用底層資料庫的預設隔離級別。大部分資料庫為read_committed(mysql預設repeatable_read)

read uncommitted(讀未提交)

該隔離級別表示乙個事務可以讀取另乙個事務修改但還沒有提交的資料。該級別不能防止髒讀和不可重複讀,因此很少使用該隔離級別。

read_committed (讀提交)

該隔離級別表示乙個事務只能讀取另乙個事務已經提交的資料。該級別可以防止髒讀,這也是大多數情況下的推薦值。

repeatable_read (可重複讀)

該隔離級別表示乙個事務在整個過程中可以多次重複執行某個查詢,並且每次返回的記錄都相同。即使在多次查詢之間有新增的資料滿足該查詢,這些新增的記錄也會被忽略。該級別可以防止髒讀和不可重複讀。

serializable (序列化)

所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。 在該隔離級別下事務都是序列順序執行的,mysql 資料庫的 innodb 引擎會給讀操作隱式加一把讀共享鎖,從而避免了髒讀、不可重讀復讀和幻讀問題。

mvcc(多版本併發控制)

mysql中,預設的事務隔離級別是可重複讀(repeatable-read),為了解決不可重複讀,innodb採用了mvcc(多版本併發控制)來解決這一問題。

mvcc是利用在每條資料後面加了隱藏的兩列(建立版本號和刪除版本號),每個事務在開始的時候都會有乙個遞增的版本號,用來和查詢到的每行記錄的版本號進行比較。 mysql mvcc

spring事務傳播行為

先來介紹下spring事務傳播行為的使用方法:@transactional(propagation=propagation.required)

public void test() 註解@transactional

通過使用 propagation 屬性設定,例如:@transactional(propagation = propagation.required)

它的propagation屬性取值有以下幾種:public enum propagation catch (exception e) catch(exception e) catch (exception e) {

// todo: handle exception

//主動捕捉異常導致框架無法捕獲,從而導致事物失效

總結本章主要講了 事務基本概念acid是什麼

,髒讀、不可重複讀、幻讀 等等術語的介紹及例子

資料庫事務的隔離級別(4種),

一文簡單了解什麼是產品

01 什麼是產品?產品是滿足使用者實際需求的有形商品或無形服務。可以從兩個關鍵點進行理解 關鍵點 一 有形的商品或無形的服務,商品指市場上可以獲得並消費的一切可以吃喝玩樂用的東西,如汽車 食物等 服務指線上線下提供滿足使用者的服務 tob toc 如餐廳服務員的服務 王者榮耀的娛樂服務 外賣 快遞 ...

一文帶你了解什麼是地磁系統

隨著 網際網路 的概念不斷深入人心,停車系統也被冠上的網際網路 之名,為車主出行和停車市場帶來了變革,地磁技術是我們比較常見的技術。今天們就聊聊地磁停車系統。原理在初中物理我們學過,地球是乙個巨大的磁場,在地球上的任意乙個地方,磁場是相對穩定的,當有鐵質等金屬物體進入磁場的時候,該磁場就會造成擾動。...

一文了解什麼是嵌入式?

如何理解嵌入式?我們做的哪些工作可以理解為嵌入式的工作?嵌入式即嵌入式系統,ieee 美國電氣和電子工程師協會 對其定義是用於控制 監視或者輔助操作機器和裝置的裝置,是一種專用的計算機系統 國內普遍認同的嵌入式系統定義是以應用為中心,以計算機技術為基礎,軟硬體可裁剪,適應應用系統對功能 可靠性 成本...