事務的ACID特性

来源:https://www.cnblogs.com/feiyu2/archive/2022/09/04/16654663.html
-Advertisement-
Play Games

事務機制 · 語雀 (yuque.com) 介紹事務 技術是為瞭解決問題而生的,通過事務我們可以解決以下問題: 多個操作不是一個整體操作,出現了部分執行成功的情況,導致數據的狀態不一致問題(原子性) 一組操作只有部分完成,沒有全部完成,但是此時可以訪問到數據的不一致狀態問題(可見性問題,隔離性) 兩 ...


事務機制 · 語雀 (yuque.com)

介紹事務

技術是為瞭解決問題而生的,通過事務我們可以解決以下問題:

  • 多個操作不是一個整體操作,出現了部分執行成功的情況,導致數據的狀態不一致問題(原子性)
  • 一組操作只有部分完成,沒有全部完成,但是此時可以訪問到數據的不一致狀態問題(可見性問題,隔離性)
  • 兩組操作併發執行,導致的併發問題
  • ......

事務存在的意義:保證系統中的數據是正確的,不同數據間不會產生矛盾,也就是保證數據狀態的一致性。


事務是什麼(事務的概念):事務是一個或多個操作的組合操作,並且事務對這個組合操作提供一個保證,如果這個組合操作執行之前的數據是一致的(即正確的),那麼執行組合操作之後的數據也應該是一致的。不論這個組合操作執行的過程中,發生了系統故障,還是在這個組合操作執行的過程中,是否與其他事務一起執行。(這也對應了上面提到的事務要解決的問題)

即使沒有事務支持, 或許上層應用依然可以工作, 然而在沒有原子性保證時, 錯誤處理就會異常複雜, 而缺乏隔離性則容易出現併發性方面的各種奇怪問題。

如果我們期望多個操作同時成功或者失敗,並且期望多組操作之間相互隔離(不相互影響),那麼就需要通過一個事務來執行。

Oracle 是支持事務的。而 MySQL 中只有 InnoDB 存儲引擎支持事務,MyISAM、Memory、Merge 等存儲引擎都不支持事務。

對事務進行控制

使用事務有兩種方式,分別為:隱式事務和顯式事務。

隱式事務

隱式事務又稱自動提交事務,顧名思義就是當執行完一條 SQL 語句後,會自動 commit 提交。

MySQL 預設使用的就是隱式事務。

顯式事務

如果我們想關閉自動提交,可以使用下邊的兩種方法之一:

  • 顯式的的使用 start transaction 或者 begin 語句開啟一個事務。這樣,在本次事務提交或者回滾之前會暫時關閉自動提交功能。
  • 把系統變數 autocommit 的值設置為 off 或者 0:set autocommit = off。這樣,本次會話將關閉自動提交功能。不論是否顯式的開啟一個事務,每次執行事務都需要使用 commit 進行提交讓事務生效,使用 rollback 對事務進行回滾。

需要註意的是:設置 autocommit 的值,只針對當前會話有效。

autocommit 參數的取值有 2 種可能:

  • autocommit = 0:取消自動提交功能
  • autocommit = 1:使用自動提交功能(預設值)

start transaction 比 begin 語句強大的一點是:可以在 start transaction 語句後面跟隨幾個修飾符,用來設置事務的訪問模式,修飾符如下所示:

  • read only:標識當前事務是一個只讀事務。即該事務內的操作只能讀取數據,而不能修改數據。
  • read write:標識當前事務是一個讀寫事務。即該事務內的操作既可以讀取數據,也可以修改數據。
  • with consistent snapshot:啟動一致性讀。即執行該命令後立即生成 ReadView,而不用等到第一條 select 語句執行。

如果我們想在 start transaction 後面跟隨多個修飾符的話,使用逗號將修飾符分開即可,

如果不顯式的指定事務的訪問模式,那麼該事務的訪問模式預設為:讀寫模式。

保存點 savepoint

可以用 savepoint 保存點名稱; 語句創建保存點,方便後續回滾到指定保存點。

保存點就是在事務對應的資料庫語句中打幾個點,我們在調用 rollback 語句時,可以回滾到指定的保存點,保留部分操作而非回滾到事務執行之前的狀態。

當我們想回滾到指定的保存點時,可以使用這個語句:rollback [work] to [savepoint] 保存點名稱;(單詞 work 和 savepoint 可有可無)。

如果 rollback 語句後沒有跟隨保存點名稱的話,會直接回滾到事務執行之前的狀態。

如果我們想刪除某個保存點,可以使用這個語句:release savepoint 保存點名稱;

completion_type 參數

MySQL 中 completion_type 參數的取值有 3 種可能:

  • completion=0(no_chain),這種情況下,當我們執行 commit 的時候會提交事務,在執行下一個事務時,還是需要我們使用 start transaction 或者 begin 來開啟事務。(參數的預設值)
  • completion=1(chain),這種情況下,當我們提交事務時,相當於執行了 commit and chain,也就是開啟一個鏈式事務;即當我們提交事務之後,會開啟一個相同隔離級別的事務。
  • completion=2(release),這種情況下,當我們提交事務時,相當於執行了 commit and release;即當我們事務之後,會自動與伺服器斷開連接。

事務的特性:ACID

事務的特性分別是:原子性 (Atomicity)、一致性 (Consistency)、隔離性 (Isolation)、持久性 (Durability)。

下麵我們分別介紹這四個特性。


一致性:一個事務能夠正確地將數據從一個一致性的狀態,轉換到另一個一致性的狀態。

數據的一致性狀態是指數據滿足我們事先定義好的約束規則。也就是在事務執行的過程中,不論出現什麼問題(比如停電、宕機),最終的執行結果都是滿足我們事先定義好的約束規則的。

數據的一致性就是正確性。


原子性:一個事務中包含的所有操作,要麼全部執行,要麼一個都不執行,即 all-or nothing。

事務在執行過程中出現故障(宕機、斷電、進程崩潰、某種完整性約束被違反),導致操作不能全部執行時,事務會被回滾 (Rollback) 到事務開始前的狀態,就像這個事務從來沒有執行過一樣。


隔離性:如果多個事務併發執行,事務之間不應該出現相互影響的情況,它其實就是資料庫的併發控制。

資料庫試圖通過事務隔離來對應用開發者隱藏,事務併發時可能出現的各種異常情況。

在實踐中,由於考慮到性能的問題,會在高性能與正確性之間做一個權衡。使用者可以根據自己的業務場景,選擇一個合適的隔離級別。


持久性:如果一個事務已經提交成功,那麼不論出現什麼問題(比如停電、宕機、存儲介質發生故障、資料庫崩潰),事務所寫入的任何數據都不會丟失。

參考資料

掘金小冊《MySQL 是怎樣運行的:從根兒上理解 MySQL》

14丨什麼是事務處理,如何使用COMMIT和ROLLBACK進行操作?-極客時間 (geekbang.org)

本文來自博客園,作者:真正的飛魚,轉載請註明原文鏈接:https://www.cnblogs.com/feiyu2/p/16654663.html


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

-Advertisement-
Play Games
更多相關文章
  • 摘要 這就是一個記錄自己進行WinUI項目實踐的博客,項目開源地址如下,覺得有幫助的可以去看看,因為項目都開源了,所以保姆級的講解肯定不如直接看代碼來的實在了。 電子腦殼項目地址 為什麼叫新 因為之前發過一篇講開發上位機應用的博客,所以作為區分就把這篇成為新的一篇了,微軟最新的windows應用開發 ...
  • RPC 遠程過程調用(遠程函數調用) GRPC google開發,跨語言RPC,用來解決微服務通信性能和擴展問題 跨語言:通過Protobuffer文件(通用文件)解決跨語言問題的 高併發:GRPC基於http/2協議,多路復用機制(服務端一個線程可以連接任意數量客戶端請求) webapi缺陷 we ...
  • 前言 在日常工作中,偶爾需要調查一些詭異的問題,而業務代碼經過長時間的演化,很可能已經變得錯綜複雜,流程、分支眾多,如果能在關鍵方法的日誌里添加上調用者的信息,將對定位問題非常有幫助。 介紹 StackTrace, 位於 System.Diagnostics 命名空間下,名字很直觀,它代表一個方法調 ...
  • 一:背景 一直在用 WinDbg 調試用戶態程式,並沒有用它調試過 內核態,畢竟不是做驅動開發,也沒有在分析 dump 中需要接觸用內核態的需求,但未知的事情總覺得很酷,加上最近在看 《深入解析 Windows 操作系統》 一書,書中有不少案例需要深入到 內核態 ,所以這篇準備整理一下如何用 Win ...
  • zabbix的基礎使用 zabbix服務端web界面使用介紹 基於zabbix服務端的部署進行下麵的操作 web界面 在我們登錄的時候預設會進入監控選項欄的儀錶盤界面 (Monitoring)監控選項欄設置 (Dashboard)儀錶盤 這裡我們一般要修改的是儀錶盤的佈局 選擇編輯儀錶盤 將“當前問 ...
  • 說明 之前安裝的brew被折騰壞了,重新安裝出現了一些問題,之前安裝homebrew的方式不好用了,網上資料很多,折騰了一番,最後成功了,整理好這篇記錄,避免一些坑。 系統版本 版本:macOS [email protected] 晶元:Apple M1 安裝 (1)終端輸入 /bin/zsh -c " ...
  • 目錄 一、前景回顧 二、進程的創建與初始化 三、如何進行進程的切換 四、運行測試 五、原書勘誤 一、前景回顧 在上一回我們大概講述了任務切換的發展,並且知道Linux採用的是一個CPU使用一個TSS的方式,在最後我們成功實現了tss。現在萬事俱備,我們正式來實現用戶進程。 二、進程的創建與初始化 進 ...
  • 2022-09-04 MySQL常用的命令: 1、進入MySQL的命令: mysql -uroot -p; 說明:-uroot是指以root方式進行登陸MySQL。之後輸入設置的SQL密碼。 2、查詢當前的時間 select now(); 3、退出的命令三種操作 (1)方式一,輸入命令 exit; ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...