什么是事務,并發帶來的事務問題以及事務隔離級別(圖文詳解)

一、什么是事務?

簡單說就是邏輯上的一組操作,要么都執行,要么都不執行。

舉個例子,假如小明要給小紅轉賬100元,這個轉賬會涉及到兩個關鍵操作:①將小明的余額減少100元。? ②將小紅的余額增加100元 。但是萬一再這兩個操作之間突然出現錯誤,比如說銀行系統崩潰,導致小明余額減少而小紅的余額沒有增加,這樣就不對了。事務就是保證這兩個關鍵操作要么都成功,要么都失敗。

二、事務的特性ACID

?1、原子性:事務是最小的執行單位,不允許分割。事務的原子性確保動作要么全部完成,要么全不起作用。

2、一致性:執行事務前后,數據保持一致。例如轉賬業務中,無論事務是否成功,轉賬者和收款人的總額應該是不變的。

3、隔離性:并發訪問數據庫時,一個用戶的事務不被其他事務所干擾,各并發事務之間的數據是獨立的。

4、持久性:一個事務被提交之后,他對數據庫的改變是持久的,即使數據庫發生故障也不應該對其有任何影響。

實現:

  • 持久性:通過 redo log來保證的

  • 原子性:通過 undo log來保證的

  • 隔離性:通過 MVCC 或鎖機制來保證的

  • 一致性:通過持久性+原子性+隔離性來保證

三、并發事務帶來的問題

在典型的應用程序中,多個事務并發運行,經常會操作相同的數據來完成各自的任務(多個用戶對統一數據進行操作)。并發雖然是必須的,但是可能會導致以下的問題。

  • 臟讀(Dirty Read):當一個事務正在訪問數據并且對數據進行了修改,此時還未提交到數據庫中,這時另一個事務也訪問并使用了這個數據,由于上個事務還未提交,此時他讀到的就是“臟數據”,根據“臟數據”所做的操作可能時不正確的。
  • 丟失修改(Lost of Modify):指一個事務讀取到一個數據,另一個事務也訪問了該數據。那么在第一個事務修改了這個數據后,第二個事務也進行了修改,此時第一個事務的修改結果就被覆蓋了,也就是丟失了,因此稱為丟失修改。? ?例如:事務1讀取某表中的數據A=20,事務2也讀取A=20,事務1修改A=A-1,事務2也修改A=A-1,最終結果A=19,事務1的修改被丟失。
  • 死鎖(Deadlock):兩個或多個事務相互等待對方釋放資源,導致系統無法繼續執行。這種情況下,只能通過終止其中一個事務或者回滾來解決死鎖。
  • 不可重復讀(Unrepeatableread):一個事務在讀取某個數據后,另一個事務修改了該數據并提交。當第一個事務再次讀取同一數據時,得到的結果與之前不一致。因此稱為不可重復讀。
  • 幻讀(Phantom read):幻讀與不可重復讀類似,它發生在一個事務(T1)讀取了幾行數據,接著另一個并發事務(T2)插入了一些數據時。在隨后的查詢中,第一個事務(T1)就會發現一些原本不存在的記錄,就好像發生了幻覺一樣,所以稱為幻讀。

不可重復度和幻讀的區別:

不可重復讀的重點是修改,幻讀的重點在于新增或者刪除。

例1(同樣的條件, 你讀取過的數據, 再次讀取出來發現值不一樣了 ):事務1中的A先生讀取自己的工資為 1000的操作還沒完成,事務2中的B先生就修改了A的工資為2000,導 致A再讀自己的工資時工資變為 2000;這就是不可重復讀。

例2(同樣的條件, 第1次和第2次讀出來的記錄數不一樣 ):假某工資單表中工資大于3000的有4人,事務1讀取了所有工資大于3000的人,共查到4條記錄,這時事務2 又插入了一條工資大于3000的記錄,事務1再次讀取時查到的記錄就變為了5條,這樣就導致了幻讀。

四、事務隔離級別

SQL 標準定義了四個隔離級別:

  • READ-UNCOMMITTED(讀取未提交): 最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致臟讀、幻讀或不可重復讀

  • READ-COMMITTED(讀取已提交): 允許讀取并發事務已經提交的數據,可以阻止臟讀,但是幻讀或不可重復讀仍有可能發生

  • REPEATABLE-READ(可重復讀): 對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發生

  • SERIALIZABLE(可串行化): 最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。


隔離級別臟讀不可重復讀幻影讀
READ-UNCOMMITTED
READ-COMMITTED×
REPEATABLE-READ××
SERIALIZABLE×××

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36286.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36286.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36286.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習筆記整理-JS-04-流程控制語句

文章目錄 一、條件語句1. if語句的基本使用2. if else if多條件分支3. if語句算法題4. switch語句5. 三元運算符 二、循環語句1. for循環語句2. for循環算法題3. while循環語句4. break和continue5. do while語句 三、初識算法1. 什么是算法2. 累加器和累乘器3. 窮舉法4. 綜合算…

給大家推薦一些文本翻譯、文檔翻譯API接口

最近在項目中要接入文本翻譯和文檔翻譯功能,滿足在工作時使用,又需要了解每個人的使用情況,所以采用了集成翻譯API的方式,我再調研時也查了比較多的資料,總結了我感覺比較好的網站。 推薦網站 1、百度翻譯&#xff0…

設計模式(2)工廠方法模式

一、 1、介紹:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。簡單工廠模式的最大優點在于工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對于客戶端來說…

odoo-034 float 浮點數比較

文章目錄 前提問題解決總結 前提 odoo 版本:13 python:3.6.9 問題 比較銷售訂單行中已送貨跟已開票,在 tree 視圖顯示搜索后的結果。發現搜索條件為已送貨 > 已開票時,結果中會包含已送貨已開票的。 解決 把這兩個值打印出…

LeNet中文翻譯

Gradient-Based Learning Applied to Document Recognition 基于梯度的學習應用于文檔識別 摘要 使用反向傳播算法訓練的多層神經網絡構成了成功的基于梯度的學習技術的最佳示例。給定適當的網絡架構,基于梯度的學習算法可用于合成復雜的決策表面,該決策…

【Vue-Router】使用 prams 路由傳參失效

報錯信息: [Vue Router warn]: Discarded invalid param(s) “name”, “price”, “id” when navigating. list.json {"data": [{"name": "面","price":300,"id": 1},{"name": "水",&quo…

node獲取微信小程序登錄用戶的openid

前提準備: 1、需要知道AppID(小程序ID) 2、AppSecret(小程序密鑰) 3、調wx.login成功后返回的code 代碼如下: const express require(express); const router express.Router(); const request require(request) const APP_URL https://api.wei…

考研408 | 【計算機網絡】 網絡層

導圖 網絡層: 路由器功能:轉發&路由選擇 數據平面 數據平面執行的主要功能是根據轉發表進行轉發,這是路由器的本地動作。 控制平面 1.傳統方法/每路由器法: 2.SDN方法(Software-Defined Networking) 控制平面中的…

C++并發多線程--多個線程的數據共享和保護

目錄 1--創建并等待多個線程 2--數據共享 2-1--數據只讀 2-2--數據讀寫 2-3--共享數據保護簡單案例 1--創建并等待多個線程 創建多個線程時,可以使用同一個線程入口函數; 多個線程的執行順序與操作系統的調度機制有關,并不和創建線程的先…

html實現商品圖片放大鏡,html圖片放大鏡預覽

效果 實現 復制粘貼&#xff0c;修改圖片路徑即可使用 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>商品圖片放大鏡</title></head><style>body {margin: 0;padding: 0;}#app {padding: 10px;posit…

關于青少年學習演講與口才對未來的領導力的塑造的探析

標題&#xff1a;青少年學習演講與口才對未來領導力的塑造&#xff1a;一項探析 摘要&#xff1a; 本論文旨在探討青少年學習演講與口才對未來領導力的塑造的重要性和影響。通過分析演講和口才對青少年的益處&#xff0c;以及如何培養這些技能來促進領導力的發展&#xff0c;我…

Harmony創建項目ohpm報錯

Harmony創建FA模型的項目時報如下錯&#xff1a; The registry is empty - edit .ohpmrc file or use "ohpm config set registry your_registry" command to set registry.解決方法&#xff1a; File -> Settings -> Build,Execution,Deployment -> Ohpm …

機器學習基礎(五)

決策樹 決策樹是一種預測模型,它代表著對象屬屬性與對象值之間的一種映射關系。樹中的每個節點代表一個對象,分叉路徑(或者叫樹枝)則代表一個屬性值。 決策樹常用方法: 分類樹分析,是一種監督學習,用于預計結果可能為離散類型。 回歸樹分析,用于預計結果為實數。 CART,…

Mysql事務及其隔離機制/隔離級別

mysql事務特性是什么&#xff1f; 原子性(atomicity)&#xff1a;一個事務必須視為一個不可分割的最小工作單元&#xff0c;整個事務中的所有操作要么全部提交成功&#xff0c;要么全部失敗回滾&#xff0c;對于一個事務來說&#xff0c;不可能只執行其中的一部分操作&#xf…

docker可視化工具Portainer

1:Portainer簡介 Portainer是一個docker可視化管理工具&#xff0c;可以非常方便地管理docker鏡像容器。官網地址&#xff1a;https://www.portainer.io/ 注&#xff1a;現在Portainer有BE&#xff08;收費&#xff09;和CE&#xff08;免費&#xff09;版本&#xff0c;安裝的…

【音視頻、chatGpt】h5頁面最小化后,再激活后視頻停住問題的解決

目錄 現象 觀察 解決 現象 頁面有時候要切換&#xff0c;要最小化&#xff1b;短時間或者幾個小時內切換回來&#xff0c;視頻可以正常續上&#xff1b;而放置較長時間&#xff0c;幾個小時或者一晚上&#xff0c;切換回來后&#xff0c;視頻可能卡死 觀察 切換頁面&#x…

【解讀Spikingjelly】使用單層全連接SNN識別MNIST

原文檔&#xff1a;使用單層全連接SNN識別MNIST — spikingjelly alpha 文檔 代碼地址&#xff1a;完整的代碼位于activation_based.examples.lif_fc_mnist.py GitHub - fangwei123456/spikingjelly: SpikingJelly is an open-source deep learning framework for Spiking Neur…

【自用】終端設備(ESP32-S3)連接云服務器 HomeAssistant + MQTT 物聯網平臺

總覽 1.流程概述 2.開始搭建&#xff01; 3. 一、流程概述 0.總體流程 二、開始搭建 1.下載 MQTTX 客戶端&#xff08; 在PC上 &#xff09; https://mqttx.app/zh/downloads 2.新建 MQTTX 連接 0.點擊左側的加號&#xff0c;開始新建連接。 一共需要填寫幾個參數&#…

會玩這 10 個 Linux 命令,一定是個有趣的 IT 男!

Linux當中有很多比較有趣的命令&#xff0c;可以動手看看&#xff0c;很簡單的。 1.rev命令 一行接一行地顛倒所輸入的字符串。 運行&#xff1a; $rev如輸入&#xff1a;shiyanlou shiyanlou2.asciiview命令 1.先安裝aview $sudo apt-get install aview2.再安裝imagema…

vue中封裝自動計算比例滑塊

此插件為另一位漂亮的前端同事小姐姐封裝,覺得非常好用于是決定記載下來,便于復用 如圖需要動態傳入需要分配權重的數組,平均分配可以自動將100%平均分給數組中的值 如果手動拖拽,則會自動計算可拖動最大區域,便于最終總權重必定為100% <el-alert class"merge-alert&…