MySQL事務及其實現

来源:https://www.cnblogs.com/GeekHuman/archive/2018/11/24/10010868.html
-Advertisement-
Play Games

事務定義 事務是訪問並更新資料庫中各個數據項的一個程式執行單元。在事務操作中,要不都做修改,要麼都不做。 事務特性 事務具有ACID四個特性,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。 原子性 原子性是指要麼 ...


事務定義

事務是訪問並更新資料庫中各個數據項的一個程式執行單元。在事務操作中,要不都做修改,要麼都不做。

事務特性

事務具有ACID四個特性,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。

原子性

原子性是指要麼不做,要麼都做。

原子性是指資料庫中不可分割的工作單位,只有使事務中所有的資料庫操作都執行成功,才算整個事務成功。

事務中任何一個SQL語句執行失敗,已經執行成功的SQL語句必須撤銷,資料庫狀態應該退回到執行事務前的狀態。

一致性

是指資料庫從一種狀態轉變為下一種一致的狀態,具體來說就是在事務開始前和事務結束以後,資料庫的完整性約束沒有被破壞。

持久性

事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。

持久性實現

  • 重做日誌

與原子性一樣,事務的持久性也是通過日誌來實現的,MySQL 使用重做日誌(redo log)實現事務的持久性,重做日誌由兩部分組成,一是記憶體中的重做日誌緩衝區,因為重做日誌緩衝區在記憶體中,所以它是易失的,另一個就是在磁碟上的重做日誌文件,它是持久的。

當我們在一個事務中嘗試對數據進行修改時,它會先將數據從磁碟讀入記憶體,並更新記憶體中緩存的數據,然後生成一條重做日誌並寫入重做日誌緩存,當事務真正提交時,MySQL 會將重做日誌緩存中的內容刷新到重做日誌文件,再將記憶體中的數據更新到磁碟上,圖中的第 4、5 步就是在事務提交時執行的。

在 InnoDB 中,重做日誌都是以 512 位元組的塊的形式進行存儲的,同時因為塊的大小與磁碟扇區大小相同,所以重做日誌的寫入可以保證原子性,不會由於機器斷電導致重做日誌僅寫入一半並留下臟數據。

除了所有對資料庫的修改會產生重做日誌,因為回滾日誌也是需要持久存儲的,它們也會創建對應的重做日誌,在發生錯誤後,資料庫重啟時會從重做日誌中找出未被更新到資料庫磁碟中的日誌重新執行以滿足事務的持久性。

  • 回滾日誌和重做日誌

到現在為止我們瞭解了 MySQL 中的兩種日誌,回滾日誌(undo log)和重做日誌(redo log);在資料庫系統中,事務的原子性和持久性是由事務日誌(transaction log)保證的,在實現時也就是上面提到的兩種日誌,前者用於對事務的影響進行撤銷,後者在錯誤處理時對已經提交的事務進行重做,它們能保證兩點:

1.發生錯誤或者需要回滾的事務能夠成功回滾(原子性);
2.在事務提交後,數據沒來得及寫會磁碟就宕機時,在下次重新啟動後能夠成功恢複數據(持久性);

在資料庫中,這兩種日誌經常都是一起工作的,我們可以將它們整體看做一條事務日誌,其中包含了事務的 ID、修改的行元素以及修改前後的值。

一條事務日誌同時包含了修改前後的值,能夠非常簡單的進行回滾和重做兩種操作,在這裡我們也不會對重做和回滾日誌展開進行介紹,可能會在之後的文章談一談資料庫系統的恢復機制時提到兩種日誌的使用。

隔離性

資料庫允許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重覆讀(repeatable read)和串列(Serializable)。

讀未提交(Read uncommitted):別人改數據的事務尚未提交,我在我的事務中也能讀到。
讀已提交(read committed):別人改數據的事務已經提交,我在我的事務中才能讀到。
可重覆讀(repeatable read):別人改數據的事務已經提交,我在我的事務中也不去讀。
串列(Serializable):我的事務尚未提交,別人就別想改數據。

隔離級別實現

資料庫對於隔離級別的實現就是使用併發控制機制對在同一時間執行的事務進行控制,限制不同的事務對於同一資源的訪問和更新,而最重要也最常見的併發控制機制,在這裡我們將簡單介紹三種最重要的併發控制器機制的工作原理。

鎖是一種最為常見的併發控制機制,在一個事務中,我們並不會將整個資料庫都加鎖,而是只會鎖住那些需要訪問的數據項, MySQL 和常見資料庫中的鎖都分為兩種,共用鎖(Shared)和互斥鎖(Exclusive),前者也叫讀鎖,後者叫寫鎖。

讀鎖保證了讀操作可以併發執行,相互不會影響,而寫鎖保證了在更新資料庫數據時不會有其他的事務訪問或者更改同一條記錄造成不可預知的問題。

  • 時間戳

除了鎖,另一種實現事務的隔離性的方式就是通過時間戳,使用這種方式實現事務的資料庫,例如 PostgreSQL 會為每一條記錄保留兩個欄位;讀時間戳中報錯了所有訪問該記錄的事務中的最大時間戳,而記錄行的寫時間戳中保存了將記錄改到當前值的事務的時間戳。

使用時間戳實現事務的隔離性時,往往都會使用樂觀鎖,先對數據進行修改,在寫回時再去判斷當前值,也就是時間戳是否改變過,如果沒有改變過,就寫入,否則,生成一個新的時間戳並再次更新數據,樂觀鎖其實並不是真正的鎖機制,它只是一種思想,在這裡並不會對它進行展開介紹。

  • 多版本和快照隔離

通過維護多個版本的數據,資料庫可以允許事務在數據被其他事務更新時對舊版本的數據進行讀取,很多資料庫都對這一機制進行了實現;因為所有的讀操作不再需要等待寫鎖的釋放,所以能夠顯著地提升讀的性能,MySQL 和 PostgreSQL 都對這一機制進行自己的實現,也就是 MVCC,雖然各自實現的方式有所不同,MySQL 就通過文章中提到的回滾日誌實現了 MVCC,保證事務並行執行時能夠不等待互斥鎖的釋放直接獲取數據。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、檢查必要的安裝包是否安裝 命令腳本: rpm -q binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibc glibc-common glibc-devel glibc-header ...
  • 172.18.237.14:一臺主機上安裝LAMP環境以及zabbix_server、zabbix_agentd 一、安裝zibbix-server 1、環境要求 yum install mysql-libs mysql-devel curl-devel gcc gcc-c++ –y 2、編譯安裝 ...
  • 1.軟硬體準備軟體:推薦使用VMwear,我用的是VMwear 10鏡像:CentOS7 硬體:因為是在宿主機上運行虛擬化軟體安裝centos,I3CPU雙核、硬碟500G、記憶體4G以上。 2.虛擬機準備1.打開VMwear選擇新建虛擬機 2.典型安裝與自定義安裝典型安裝:VMwear會將主流的配置 ...
  • Redis概述 1.是一個開源的,先進的<key,value>存儲,並用與構建高性能,可擴展的應用程式的完美解決方案 2.從它的許多競爭繼承來的三個主要特點: l Redis資料庫完全在記憶體中,使用磁碟僅用於持久性。 l 相比許多鍵值數據存儲,Redis擁有一套較為豐富的數據類型。String,Li ...
  • [20181124]關於降序索引問題3.txt--//鏈接:blog.itpub.net/267265/viewspace-2221425/,探討降序索引中索引的鍵值。--//實際上使用函數sys_op_descend.--//鏈接:http://blog.itpub.net/267265/view ...
  • [20181124]關於降序索引問題2.txt--//鏈接:blog.itpub.net/267265/viewspace-2221425/,探討降序索引中索引的鍵值。--//實際上使用函數sys_op_descend.--//前面已經提到結尾加入FF,為了排序的需要。這樣導致chr(0),以及後續 ...
  • MongoDB高級應用 Author:SimpleWu 聚合 聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點類似sql語句中的 count( )。 $group 使用$group是對篩選的數據進行分組。類似於mysql中的group by關鍵字。 ...
  • 不管你是從事Python、Java、Go、PHP、Ruby等等… Redis都應該是一個比較熟悉的中間件。而大部分經常寫業務代碼的程式員,實際工作中或許只用到了set value、get value兩個操作。對Redis缺乏一個整體的認識。今天就來對Redis的常見問題做一個總結。希望能夠幫助到大家 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...