MySQL 事務(Transaction)詳解

MySQL 事務(Transaction)詳解


1. 什么是事務?

事務(Transaction)是一組要么全部執行,要么全部回滾的 SQL 語句,用于保證數據一致性。事務一般用于銀行轉賬、訂單支付等操作,確保多個步驟要么全部成功,要么全部失敗。

事務的特點(ACID):

  1. 原子性(Atomicity):事務是一個不可分割的最小操作單位,要么全部執行,要么全部回滾。
  2. 一致性(Consistency):事務執行后,數據庫必須保持一致狀態。
  3. 隔離性(Isolation):多個事務并發執行時,相互之間不會影響。
  4. 持久性(Durability):事務提交后,對數據庫的更改是永久性的。

2. 事務的基本操作

在 MySQL 中,事務通常用 START TRANSACTIONBEGIN 開始,COMMIT 提交,ROLLBACK 回滾:

-- 開啟事務
START TRANSACTION;-- 執行 SQL 語句
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;-- 提交事務(數據永久生效)
COMMIT;

如果中途發生錯誤,可以回滾:

-- 開啟事務
START TRANSACTION;-- 執行 SQL 語句
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
-- 發生錯誤,回滾事務
ROLLBACK;

3. 事務的隔離級別

MySQL 事務的隔離級別影響并發事務的執行方式,常見隔離級別:

隔離級別臟讀不可重復讀幻讀默認值
READ UNCOMMITTED(讀未提交)? 可能? 可能? 可能?
READ COMMITTED(讀已提交)? 避免? 可能? 可能?
REPEATABLE READ(可重復讀)? 避免? 避免? 可能?(MySQL 默認)
SERIALIZABLE(串行化)? 避免? 避免? 避免?

如何設置隔離級別?

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

4. 事務的常見問題

(1)臟讀(Dirty Read)

發生在 READ UNCOMMITTED 級別:一個事務能讀取另一個未提交事務的數據,如果對方回滾,讀取的數據就是無效的。

-- 事務 A
START TRANSACTION;
UPDATE accounts SET balance = 500 WHERE user_id = 1;
-- 此時事務 A 還未提交-- 事務 B
SELECT balance FROM accounts WHERE user_id = 1; -- 讀取到了未提交的值

? 解決方案:使用 READ COMMITTED 以上隔離級別。


(2)不可重復讀(Non-Repeatable Read)

發生在 READ COMMITTED 級別:同一個事務多次讀取數據,發現數據不一致(另一事務修改了數據并提交)。

-- 事務 A
START TRANSACTION;
SELECT balance FROM accounts WHERE user_id = 1; -- 讀取值 500-- 事務 B(修改后提交)
UPDATE accounts SET balance = 600 WHERE user_id = 1;
COMMIT;-- 事務 A(再次讀取)
SELECT balance FROM accounts WHERE user_id = 1; -- 發現變成 600

? 解決方案:使用 REPEATABLE READ 以上隔離級別。


(3)幻讀(Phantom Read)

發生在 REPEATABLE READ 級別:事務中多次查詢,發現新增的行。

-- 事務 A
START TRANSACTION;
SELECT COUNT(*) FROM orders WHERE user_id = 1; -- 10 條數據-- 事務 B(插入新數據并提交)
INSERT INTO orders(user_id, amount) VALUES (1, 100);
COMMIT;-- 事務 A(再次查詢)
SELECT COUNT(*) FROM orders WHERE user_id = 1; -- 發現 11 條數據

? 解決方案:使用 SERIALIZABLE 級別,防止新數據插入。


5. InnoDB 與 MyISAM 事務支持

存儲引擎事務支持適用場景
InnoDB? 支持事務適合高并發、數據一致性要求高的系統,如金融、訂單
MyISAM? 不支持事務適合讀取操作多的場景,如 CMS 系統

如何查看表的存儲引擎?

SHOW TABLE STATUS WHERE Name = 'my_table';

6. MySQL 事務最佳實踐

  1. 盡量使用 InnoDB,保證事務支持。
  2. 縮小事務范圍,避免長時間鎖表影響性能。
  3. 避免事務嵌套,減少鎖競爭。
  4. 使用索引優化查詢,減少鎖的范圍,提高并發效率。
  5. 發生錯誤時記得 ROLLBACK,確保數據一致性。
  6. 適當選擇隔離級別,根據業務需求權衡并發性和數據一致性。

7. 事務相關的 SQL 語句

操作SQL 語句
開啟事務START TRANSACTION;BEGIN;
提交事務COMMIT;
回滾事務ROLLBACK;
設置隔離級別SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
查看當前事務隔離級別SELECT @@TRANSACTION_ISOLATION;

8. 總結

  • 事務保證 ACID,保證數據庫的一致性。
  • MySQL 事務隔離級別決定數據并發訪問時的行為,REPEATABLE READ 是 MySQL 默認隔離級別。
  • 事務的三大問題:臟讀、不可重復讀、幻讀,可通過不同的隔離級別解決。
  • InnoDB 支持事務,MyISAM 不支持
  • 務必在事務結束后 COMMITROLLBACK,防止事務長時間占用資源。

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

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

相關文章

SPI 機制與 Spring Boot AutoConfiguration 對比解析

一、架構效率革命性提升 1.1 類加載效率躍升 Spring Boot 2.7引入的AutoConfiguration.imports采用清單式配置加載,對比傳統SPI機制: 傳統SPI掃描路徑:META-INF/services/** Spring Boot新方案:META-INF/spring/org.springfram…

【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的異常處理:全局異常與自定義異常

<前文回顧> 點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、開篇整…

思源配置阿里云 OSS 踩坑記

按照正常的配置IAM&#xff0c;賦予OSS權限&#xff0c;思源筆記還是無法使用&#xff0c;缺少ListBuckets權限。 正常配置權限&#xff0c;又無法覆蓋&#xff0c;因此需要手動配置權限。 {"Version": "1","Statement": [{"Effect":…

Debezium日常分享系列之:Debezium Charts

Debezium日常分享系列之&#xff1a;Debezium Charts 最近&#xff0c;圍繞 Debezium 圖表發生了一些變化&#xff0c;所以我在這里解釋這些變化是什么以及背后的理由。正如您從我們的最新公告中了解到的&#xff0c;我們將發布 Debezium 管理平臺的第一個版本。 Debezium 管理…

moveit2基礎教程上手-使用xarm6演示

0、前置信息 開發環境&#xff1a;wsl。 ros版本&#xff1a;jazzy&#xff0c;ubuntu版本&#xff1a;24.04 xarm-ros2地址 1、啟動Rviz&#xff0c;加載 Motion Planning Plugin&#xff0c;實現演示功能 Getting Started — MoveIt Documentation: Rolling documentation…

第十六屆藍橋杯模擬二

由硬件框圖可以知道我們要配置LED 和按鍵 一.LED 先配置LED的八個引腳為GPIO_OutPut,鎖存器PD2也是,然后都設置為起始高電平,生成代碼時還要去解決引腳沖突問題 二.按鍵 按鍵配置,由原理圖按鍵所對引腳要GPIO_Input 生成代碼,在文件夾中添加code文件夾,code中添加fun.…

在OpenGL ES中將值傳入shader的方法總結

在OpenGL ES中&#xff0c;將值傳入Shader的方式主要有以下幾種&#xff1a; 1. Uniform變量 用途&#xff1a;用于傳遞在繪制過程中不變的常量數據&#xff0c;如變換矩陣、顏色等。步驟&#xff1a; 在Shader中聲明Uniform變量&#xff1a;uniform mat4 uMVPMatrix; // 例如…

華為總部-華為東莞松山湖基地參觀游學攻略

你有聽說過全球科技巨頭-華為嗎&#xff1f;今天帶你深入了解這一世界標桿工廠的秘密基地。跟隨華研標桿游學服務商一窺華為的強大實力。 在東莞松山湖&#xff0c;這里不僅僅是華為的終端總部&#xff0c;更是研發、銷售和增值業務的核心區域。我們一行人抵達后&#xff0c;立…

Linux小知識

1. /etc目錄 我們在配置文件中一直會調用 /etc目錄 cd /etc/xxxx.conf etc的全稱是editable configuration&#xff08;其中一種說法&#xff09;意為可編輯的配置&#xff1b;此目錄主要用來存放系統的配置文件和初始化文件的&#xff1b;像網絡配置 用戶信息 各種服務的配置…

晶鑫股份邁向敏捷BI之路,永洪科技助力啟程

數據驅動的時代&#xff0c;每一次技術的創新和突破都在為企業的發展注入新的動力。而敏捷性也不再是選擇&#xff0c;是企業生存與發展的必要條件。作為連續5年獲得中國敏捷BI第一名的永洪科技&#xff0c;通過不斷地在數據技術領域深耕細作&#xff0c;再次迎來了行業內的關注…

基于CAMEL 的Workforce 實現多智能體協同工作系統

文章目錄 一、workforce 簡介1.架構設計2.通信機制 二、workforce 工作流程圖示例1.用戶角色2.工作流程 三、workforce 中重要函數說明1.__init__函數2.add_single_agent_worker 函數3.add_role_playing_worker 函數4.add_workforce 函數 四、基于workforce實現多智能體協調&am…

每日一題力扣2974.最小數字游戲c++

2974. 最小數字游戲 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> numberGame(vector<int>& nums) {vector<int> arr(nums.size());sort(nums.begin(),nums.end());for(size_t i0;i<nums.size();i2){arr[i]nums[i1]…

對接馬來西亞、印度、韓國、越南等全球金融數據示例

Python對接StockTV全球金融數據API的封裝實現及使用教程&#xff1a; import requests import websockets import asyncio from typing import Dict, List, Optional, Union from datetime import datetimeclass StockTVClient:"""StockTV全球金融數據API客戶端…

Adobe After Effects 操作

Adobe After Effects &#xff08;AE&#xff09;可以實現將多個元素進行合成&#xff0c;實現特殊效果。AE的項目文件是aep&#xff0c;可以將素材、層、效果等一切信息&#xff0c;保存在這個項目文件中。 AE的原理&#xff0c;和PS的原理非常類似。 操作界面 操作界面如…

【React】基于自定義Hook提取公共邏輯

目錄 自定義Hook自定義Hook 1自定義Hook 2使用 注意事項 自定義Hook 作用&#xff1a;提取封裝一些公共的處理邏輯 玩法&#xff1a;創建一個函數&#xff0c;名字需要是 useXxx &#xff0c;后期就可以在組件中調用這個方法&#xff01; 自定義Hook 1 頁面加載的時候修改瀏…

AUTOSAR與arxml的文檔解析

如下是文檔腦圖 一、文檔概述 該文檔是 AUTOSAR 經典平臺的應用接口用戶指南&#xff0c;主要解釋 **Al Table&#xff08;應用接口表&#xff09;** 的結構、方法論及相關技術細節&#xff0c;幫助開發者理解如何通過標準化接口實現軟件組件的互操作性。 關鍵內容 目的&#…

油候插件、idea、VsCode插件推薦(自用)

開發軟件&#xff1a; 之前的文章&#xff1a; 開發必裝最實用工具軟件與網站 推薦一下我使用的開發工具 目前在用的 油候插件 AC-baidu-重定向優化百度搜狗谷歌必應搜索_favicon_雙列 讓查詢變成多列&#xff0c;而且可以流式翻頁 Github 增強 - 高速下載 github下載 TimerHo…

阿里云平臺服務器操作以及發布靜態項目

目錄&#xff1a; 1、云服務器介紹2、云服務器界面3、發布靜態項目1、啟動nginx2、ngixn訪問3、外網訪問測試4、拷貝靜態資源到nginx目錄下并重啟nginx 1、云服務器介紹 2、云服務器界面 實例詳情&#xff1a;里面主要顯示云服務的內外網地址以及一些啟動/停止的操作。監控&…

Spring Cache 實戰指南

redis中常見的問題 前言 在本文中&#xff0c;我們將探討 Redis 在緩存中的應用&#xff0c;并解決一些常見的緩存問題。為了簡化理解&#xff0c;本文中的一些配置是直接寫死的&#xff0c;實際項目中建議將這些配置寫入配置文件&#xff0c;并通過配置文件讀取。 一、為什…

區塊鏈開發技術公司:引領數字經濟的創新力量

在數字化浪潮席卷全球的今天&#xff0c;區塊鏈技術作為新興技術的代表&#xff0c;正以其獨特的去中心化、不可篡改和透明性等特點&#xff0c;深刻改變著各行各業的發展格局。區塊鏈開發技術公司&#xff0c;作為這一領域的先鋒和推動者&#xff0c;正不斷研發創新&#xff0…