Mysql基礎篇(四)之事務

来源:https://www.cnblogs.com/yun3k/archive/2023/07/03/17522456.html
-Advertisement-
Play Games

# 一. 事務簡介 **事務是一組操作的集合,它是一個不可分隔的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。** **就比如:張三給李四轉賬1000塊錢,張三銀行賬戶的錢減少了1000,而李四銀行賬戶的錢要增加1000。這一組操作就必須 ...


一. 事務簡介

事務是一組操作的集合,它是一個不可分隔的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。

就比如:張三給李四轉賬1000塊錢,張三銀行賬戶的錢減少了1000,而李四銀行賬戶的錢要增加1000。這一組操作就必須在一個事務的範圍內,要麼都成功,要麼都失敗。

正常情況:轉賬這個操作,需要分為以下這麼三步來完成,三步完成之後,張三減少1000,而李四增加1000,轉賬成功:

異常情況:轉賬這個操作,也是分為以下這麼三步來完成,在執行第三步時報錯了,這樣就導致張三減少1000塊錢,而李四的金額沒變,這樣就造成了數據的不一致,就出現問題了。

為瞭解決上述的問題,就需要通過數據的事務來完成,我們只需要在業務邏輯執行之前開啟事務,執行完畢後提交事務。如果執行過程中報錯,則回滾事務,把數據恢復到事務開始之前的狀態。

註:預設MySQL的事務時自動提交的,也就是說,當執行完一條DML語句時,MySQL會立即隱式的提交事務。

二. 事務操作

數據準備:

drop table if exists account;

create table account( 
	id int primary key AUTO_INCREMENT comment 'ID', 
	name varchar(10) comment '姓名', 
	money double(10,2) comment '餘額' 
) comment '賬戶表';

insert into account(name, money) VALUES ('張三',2000), ('李四',2000);

1. 未控制事務

(1). 測試正常情況

-- 1. 查詢張三餘額 
select * from account where name = '張三'; 

-- 2. 張三的餘額減少1000 
update account set money = money - 1000 where name = '張三'; 

-- 3. 李四的餘額增加1000 
update account set money = money + 1000 where name = '李四';

測試完畢之後檢查數據的狀態,可以看出數據操作前後是一致的。

(2). 測試異常情況

-- 1. 查詢張三餘額 
select * from account where name = '張三'; 

-- 2. 張三的餘額減少1000 
update account set money = money - 1000 where name = '張三'; 
出錯了.... 

-- 3. 李四的餘額增加1000 
update account set money = money + 1000 where name = '李四';

我們把數據都恢復到2000,然後再次一次性執行上述的SQL語句(出錯了... 這句話不符合SQL語法,執行就會報錯),檢查最終的數據情況,發現數據在操作前後不一致了。

2. 控制事務一

(1). 查看/設置事務提交方式

SELECT @@autocommit;

SET @@autocommit = 0;

(2). 提交事務

COMMIT;

(3). 回滾事務

ROLLBACK;

註:上述的這種方式,我們是修改了事務的自動提交行為,把預設的自動提交修改為了手動提交,此時我們執行的DML語句都不會提交,需要手動的執行commit進行提交。

3. 控制事務二

(1).開啟事務

START TRANSACTION 或 BEGIN ;

(2).提交事務

COMMIT;

(3).回滾事務

ROLLBACK;

轉賬案例:

-- 開啟事務 
start transaction;

-- 1. 查詢張三餘額 
select * from account where name = '張三'; 

-- 2. 張三的餘額減少1000 
update account set money = money - 1000 where name = '張三'; 

-- 3. 李四的餘額增加1000 
update account set money = money + 1000 where name = '李四'; 

-- 如果正常執行完畢, 則提交事務 
commit; 

-- 如果執行過程中報錯, 則回滾事務 
-- rollback;

三. 事務四大特性

  • 原子性(Atomicity):事務是不可分隔的最小操作單元,要麼全部成功,要麼全部失敗。

  • 一致性(Consistency):事務完成時,必須使所有的數據都保持一致。

  • 隔離性(Isolation):資料庫系統提供的隔離機制,保證事務在不受外部併發操作影響的獨立環境下運行。

  • 持久性(Durability):事務一旦提交或回滾,它對資料庫中的數據的改變就是永久的。

上述就是事務的四大特性,簡稱ACID。

四. 併發事務問題

1. 臟讀:一個事務讀到另一個事務還沒有提交的數據

2. 不可重覆讀:一個事務先後讀取同一條記錄,但兩次讀取的數據不同,稱之為不可重覆讀

3. 幻讀:一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發現這行數據已經存在,好像出現了”幻影”。

五. 事務隔離級別

為瞭解決併發事務所引發的問題,在資料庫中引入了事務隔離級別。主要有以下幾種:

隔離級別 臟讀(是否解決) 不可重覆讀(是否解決) 幻讀(是否解決)
讀未提交(Read uncommitted) 未解決 未解決 未解決
讀已提交(Read committed) 解決 未解決 未解決
可重覆讀(Repeatable Read)(預設) 解決 解決 未解決
串列化(Serializable) 解決 解決 解決

1. 查詢事務隔離級別

SELECT @@TRANSACTION_ISOLATION;

2. 設置事務隔離級別

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL 
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

SESSION:session表示當前視窗的隔離級別。

GLOBAL:global表示全局的隔離級別

註:事務隔離級別越高,數據越安全,但是性能越低。

更多mysql學習請關註微信公眾號”雲哥技術yun3k”,回覆”mysql學習”,免費領取mysql全套學習資料。


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

-Advertisement-
Play Games
更多相關文章
  • 假設有以下兩個實體: public class Student { public int StuID { get; set; } public string? Name { get; set; } public IEnumerable<Homework>? Homeworks { get; set; ...
  • # 一個跨平臺的`ChatGPT`懸浮窗工具 使用`avalonia`實現的`ChatGPT`的工具,設計成懸浮窗,並且支持插件。 ## 如何實現懸浮窗? 在使用`avalonia`實現懸浮窗也是非常的簡單的。 實現我們需要將窗體設置成無邊框 在`Window`根節點添加一下屬性,想要在Linux下 ...
  • 繼上篇:Taurus .Net Core 微服務開源框架:Admin 插件【4-2】 - 配置管理-Mvc【含請求日誌列印】,本篇繼續介紹下一個內容:系統配置節點:Mvc - Plugin - MicroService 配置界面:註冊中心 ...
  • Linux下PAM認證詳解(以centos7為例) PAM簡介(Pluggable Authentication Modules,可插拔認證模塊) Sun公司於1995年開發的一種與認證相關的通用框架機制:PAM(可插拔認證模塊)是實現認證工作的一個模塊。 因為每個服務都用到不同的認證方式,所以就需 ...
  • CS5466作為ASL集睿致遠新推出的高性能Type-C to HDMI2.1協議轉換器,可以通過HDMI輸出埠作為TMDS或FRL發射機進行操作。 CS5466適配於多個配件市場和現實應用主板,例如:主板,顯示埠,擴展塢等。CS5266還配備了最高級別的HDCP嵌入式秘鑰,能夠安全傳輸受保護... ...
  • # Linux磁碟操作:分區、格式化、掛載 ## 一、分區 > **fdisk分區** > > (1)fdisk命令只支持msdos,分區的時候只支持小容量硬碟( (2)fdisk命令不支持gpt,所以當使用fdisk命令給gpt類型硬碟分區是會出現告警 1. 首先先把設備關機,添加一塊新的磁碟 2 ...
  • 這裡分享一個我寫的MySQL自動安裝腳本mysql_auto_install.sh,它的功能非常簡單,就是自動化安裝MySQL單實例,讓DBA的工作更簡單、輕鬆一些,不用去手工安裝MySQL實例。從簡單重覆的工作中釋放出來。 下麵是關於mysql_auto_install.sh腳本的一些說明: 1: ...
  • 一丶打開客戶端: 對象資源管理器->管理->維護計劃(右鍵點擊)->維護計劃嚮導 二丶打開後點擊下一步, 填寫名稱與說明並更改備份計劃 三丶點下一步, 選擇維護任務 四丶點擊下一步, 選擇需要備份的資料庫, 和備份文件路徑 五丶點擊下一步, 選擇報告文件保存路徑 六丶點擊下一步, 查看維護計劃, 沒 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...