MySQL-事務(TRANSACTION-ACID)管理

目錄

一、什么是事務?

1.1.事務的定義

1.2.事務的基本語句

1.3.事務的四大特性(ACID)

二、數據庫的并發控制

2.1.什么是并發及并發操作帶來的影響?

2.2.并發操作帶來的隔離級別

三、使用事務的場景

3.1.銀行轉賬場景示例

3.2.模擬丟失修改、不可重復讀、讀臟數據

一、什么是事務?

1.1.事務的定義

MySQL事務是數據庫操作的一個基本單元,它確保一組操作要么全部成功,要么全部失敗。事務的主要目的是保證數據的一致性和完整性。

1.2.事務的基本語句

一個事務由應用程序的一組操作序列組成,它以 BEGIN TRANSACTION語句開始,以 END TRANSACTION 結束語句。

事務定義的語句如下:

  1. BEGIN TRANSACTION: 事務開始。
  2. END TRANSACTION:事務結束。
  3. COMMIT:事務提交。該操作表示事務成功地結束,它將通知事務管理器該事務的所有更新操作現在可以被提交或永久地保留。
  4. ROLLBACK:事務回滾。該操作表示事務非成功地結束,它將通知事務管理器出故障了,數據庫可能處于不一致狀態,該事務的所有更新操作必須回滾或撤銷。這意味著將撤銷該事務對數據庫的更新。這樣,數據庫恢復到該事務執行第一條語句之前的狀態。

典型示例:

典型的例子是銀行轉賬業務。對“從賬戶 A 轉入賬戶 B 金額x元”業務,站在顧客角度來看,轉賬是一次單獨操作;而站在數據庫系統的角度它至少是由兩個操作組成的,第一步從賬戶A減去x元,第二步給賬戶B加上x元。下面是銀行轉賬事務的偽代碼:

BEGIN TRANSACTION
????????read(A);????????????????????????/*讀賬戶A的余額*/
????????A=A-x;
????????IF(A<0)THEN
? ? ? ? ? ? ? ? ?print("金額不足,不能轉賬");

????????????????ROLLBACK;????????/*撤銷該事務,回到事務執行前的狀態*
????????ELSE
????????????????write(A);????????????????/*寫入賬戶A的余額*/
????????????????read(B);
????????????????B=B+1;
????????????????write(B);
????????????????COMMIT;????????????????/*提交事務*/
????????ENDIF;
END TRANSACTION

1.3.事務的四大特性(ACID)

  1. 原子性(Atomicity):事務中的所有操作要么全部完成,要么全部不完成。如果事務中的任何操作失敗,整個事務將回滾到初始狀態。
  2. 一致性(Consistency):事務執行前后,數據庫的狀態必須保持一致。這意味著事務必須遵循數據庫的約束和規則。
  3. 隔離性(Isolation):多個事務并發執行時,一個事務的操作不會影響其他事務。每個事務都感覺不到其他事務的存在。
  4. 持久性(Durability):一旦事務提交,它對數據庫的修改就是永久性的,即使系統發生故障也不會丟失。

二、數據庫的并發控制

2.1.什么是并發及并發操作帶來的影響?

所謂并發操作,是指在多用戶共享的系統中,許多用戶可能同時對同一數據進行操作。這種機制就有可能導致,其他用戶想要得到原始數據,但由于其他用戶的讀寫操作,導致數據已經進行修改等情況的產生。

通常并發操作導致數據的不一致性主要有三類:

1.丟失修改:
????????如圖 12-7(a)所示,事務 T!、T,都是對數據 A 做減1操作。事務T,在時劍ち把A 修改后的值15寫入數據庫,但事務T在時刻t再把它對A減1后的值15寫入。兩個事務都是對 A的值進行減1操作并且都執行成功,但A中的值卻只減了1。現實的例子如售票系統,同時售出了兩張票,但數據庫里的存票卻只減了一張,造成數據的不一致。原因在于T事務對數據庫的修改被 T事務覆蓋而丟失了,破壞了事務的隔離性。

2.不可重復讀:

????????如圖 12-7(b)所示,事務 T讀取 A、B 的值后進行運算,事務 T在 t時刻對 B的值做了修改以后,事務 T又重新讀取 A、B 的值再運算,同一事務內對同一組數據的相同運算結果不同,顯然與事實不相符。同樣是事務 工干擾了事務 T的獨立性。

3.讀臟數據:

????????如圖 12-7(c)所示,事務 T對數據 ℃ 修改之后,在 t時刻事務 T讀取修改后的 ℃ 值做處理,之后事務 T回滾,數據 ℃ 恢復了原來的值,事務 T對C所做的處理是無效的,它讀的是被丟掉的垃圾值。

其主要原因是事務的并發操作破壞了事務的隔離性。DBMS的并發控制子系統負責協調并發事務的執行,保證數據庫的完整性不受破壞,避免用戶得到不正確的數據。

2.2.并發操作帶來的隔離級別

并發操作對應產生了由于不同隔離級別所產生的不同并發問題。一般規律也是:隔離級別越高,數據一致性越強,但并發性能相應就越低。

并發問題讀未提交(Read Uncommitted)讀已提交(Read committed)可重復讀(Repeatable Read)串行化(Serializable)
臟讀(Dirty Read)×
不可重復讀××

幻讀(Phantom)

××MySQL在可重復讀級別通過Next-Key鎖解決幻讀
丟失更新××不能完全解決

幻讀和不可重復讀:

類型關注點變化
不可重復讀同一條記錄的數據變化余額從?1000?→?900(值變化)
幻讀結果集的行數變化第一次查有?5?條,第二次變?6?條。

三、使用事務的場景

3.1.銀行轉賬場景示例

測試事務的一致性(要么同時成功,要么同時失敗)

-- 表結構設計
drop table book;
CREATE TABLE `book` (`recID` INT(11) PRIMARY KEY AUTO_INCREMENT,`title` VARCHAR(50) NOT NULL,`type` VARCHAR(20) NOT NULL,`price` DECIMAL(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;show TABLES;select * from book b;
-- 初始數據
INSERT INTO `book` (`title`, `type`, `price`) VALUES
('Java Programming', 'Computer', 16.00),
('Java EE Technology', 'Computer', 5.00),
('Information System', 'Computer', 15.00);-- 事務操作語句
BEGIN;
-- 批量降價8元
UPDATE book SET price = price - 8 WHERE recID = 1;
UPDATE book SET price = price - 8 WHERE recID = 2;
UPDATE book SET price = price - 8 WHERE recID = 3;-- 驗證價格是否不低于0
SELECT * FROM book WHERE price < 0;-- 根據驗證結果選擇提交或回滾
COMMIT; -- 無負值時提交
ROLLBACK; -- 出現負值時回滾

驗證:

驗證價格是否不低于0,因為出現負值,我們執行回滾操作,看數據是否會回到我們最開始的狀態值。

3.2.模擬丟失修改、不可重復讀、讀臟數據

由于mysql其自身的默認隔離級別就已經是可重復讀,即使并發執行,也不會產生丟失修改和不可重復讀問題。

-- 查看當前會話的隔離級別(MySQL 5.7+ 和 MariaDB)SELECT @@transaction_isolation;-- 查看全局隔離級別SELECT @@global.transaction_isolation;-- mysql中的默認隔離級別是:REPEATABLE-READ

模擬:

-- 1. 表結構設計(以銀行賬戶為例)
CREATE TABLE account (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,balance DECIMAL(10, 2) NOT NULL  -- 賬戶余額
);
-- 插入初始數據:
INSERT INTO account (name, balance) VALUES ('Alice', 1000.00);-- 2. 模擬不可重復讀
-- 現象:事務A多次讀取同一數據,事務B修改并提交后,事務A兩次讀取結果不一致。
-- 隔離級別:READ COMMITTED(讀已提交)
-- 操作步驟:-- 事務A(首次讀取):
BEGIN;
SELECT balance FROM account WHERE name = 'Alice'; -- 結果:1000.00-- 事務B(修改并提交):
BEGIN;
UPDATE account SET balance = 900.00 WHERE name = 'Alice';
COMMIT; -- 修改生效-- 事務A(再次讀取):
SELECT balance FROM account WHERE name = 'Alice'; -- 結果:900.00(與第一次不一致)
COMMIT;
-- 結果:事務A兩次讀取結果不同,即不可重復讀。-- 3. 模擬丟失修改
-- 現象:兩個事務同時讀取并修改同一數據,后提交的事務覆蓋前者的修改。
-- 隔離級別:READ UNCOMMITTED(讀未提交)或 READ COMMITTED
-- 操作步驟:-- 事務A(讀取并修改):
BEGIN;
SELECT balance FROM account WHERE name = 'Alice'; -- 讀取1000.00
UPDATE account SET balance = 1000.00 - 100 = 900.00 WHERE name = 'Alice';-- 事務B(同時讀取并修改):
BEGIN;
SELECT balance FROM account WHERE name = 'Alice'; -- 仍讀取1000.00(未提交的數據)
UPDATE account SET balance = 1000.00 - 200 = 800.00 WHERE name = 'Alice';
COMMIT; -- 先提交-- 事務A提交:
COMMIT; -- 覆蓋事務B的修改
-- 結果:余額變為 900.00(事務B的修改丟失),正確應為 700.00。

開啟事務A B

事務A讀取到的值

事務B修改提交之后:

事務A再次讀取:

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

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

相關文章

centos系統docker配置milvus教程

本人使用的是京東云服務器配置milvus 參考教程&#xff1a;https://blog.csdn.net/withme977/article/details/137270087 首先確保安裝了docker 、docker compose docker -- version docker-compose --version創建milvus工作目錄 mkdir milvus # 進入到新建的目錄 cd milvu…

什么是JSON ?從核心語法到編輯器

一、什么是JSON &#xff1f; JSON&#xff0c;即 JavaScript 對象表示法&#xff0c;是一種輕量級、跨語言、純文本的數據交換格式 。它誕生于 JavaScript 生態&#xff0c;但如今已成為所有編程語言通用的 “數據普通話”—— 無論前端、后端&#xff0c;還是 Python、Java&…

計算機網絡(7)——物理層

1.數據通信基礎 1.1 物理層基本概念 物理層(Physical Layer)是所有網絡通信的物理基礎&#xff0c;它定義了在物理介質上傳輸原始比特流(0和1)所需的機械、電氣、功能、過程和規程特性 1.2 數據通信系統模型 信源&#xff1a;生成原始數據的終端設備&#xff0c;常見形態包括…

深度學習基礎知識總結

1.BatchNorm2d 加速收斂&#xff1a;Batch Normalization 可以使每層的輸入保持較穩定的分布&#xff08;接近標準正態分布&#xff09;&#xff0c;減少梯度更新時的震蕩問題&#xff0c;從而加快模型訓練速度。 減輕過擬合&#xff1a;批歸一化引入了輕微的正則化效果&#…

iOS 抖音首頁頭部滑動標簽的實現

抖音首頁的頭部滑動標簽(通常稱為"Segmented Control"或"Tab Bar")是一個常見的UI組件&#xff0c;可以通過以下幾種方式實現&#xff1a; 1. 使用UISegmentedControl 最簡單的實現方式是使用系統自帶的UISegmentedControl&#xff1a; let segmentedCo…

ThreadLocal實現原理

ThreadLocal 是 Java 中實現線程封閉&#xff08;Thread Confinement&#xff09;的核心機制&#xff0c;它通過為每個線程創建變量的獨立副本來解決多線程環境下的線程安全問題。 Thread └── ThreadLocalMap (threadLocals) // 每個線程持有的專屬Map├── Entry[] tab…

【筆記】結合 Conda任意創建和配置不同 Python 版本的雙軌隔離的 Poetry 虛擬環境

如何結合 Conda 任意創建和配置不同 Python 版本的雙軌隔離的Poetry 虛擬環境&#xff1f; 在 Python 開發中&#xff0c;為不同項目配置獨立且適配的虛擬環境至關重要。結合 Conda 和 Poetry 工具&#xff0c;能高效創建不同 Python 版本的 Poetry 虛擬環境&#xff0c;接下來…

defineAsyncComponent

下面,我們來系統的梳理關于 defineAsyncComponent 懶加載 的基本知識點: 一、異步組件核心概念 1.1 什么是異步組件? 異步組件是 Vue 中一種按需加載組件的機制,允許將組件代碼拆分為獨立的 chunk,在需要時再從服務器加載。這種技術能顯著提升應用初始加載速度。 1.2 為…

ANeko v1.0.3 | 在手機里養只寵物貓 實時互動 動畫細膩

ANeko是一款專為喜歡貓咪的用戶設計的互動養寵應用。它讓你在手機屏幕上擁有一只可愛的貓咪動畫&#xff0c;這只貓咪會實時跟隨你的手指觸摸軌跡&#xff0c;帶來生動有趣的互動體驗。該應用不僅保留了用戶熟悉的交互式貓動畫&#xff0c;還結合了現代高清圖形技術&#xff0c…

人工智能AI

AI 簡介 AI 使我們能夠生成可以改進衛生保健的出色軟件,讓人能夠克服生理上的不便,改進智能基礎結構,創造令人驚嘆的娛樂體驗,甚至拯救地球! 什么是 AI? 簡而言之,AI 就是一種模仿人類行為和能力的軟件。 關鍵工作負載包括: 機器學習 - 它通常是 AI 系統的基礎,也是…

Vue 中 data 選項:對象 vs 函數

Vue 中 data 選項&#xff1a;對象 vs 函數 在 Vue 開發中&#xff0c;data 選項可以使用對象或函數形式&#xff0c;了解它們的使用場景非常重要。下面我將通過一個直觀的示例來展示兩者的區別和適用場景。 <!DOCTYPE html> <html lang"zh-CN"> <h…

python打卡第49天

知識點回顧&#xff1a; 通道注意力模塊復習空間注意力模塊CBAM的定義 CBAM 注意力模塊介紹 從 SE 到 CBAM&#xff1a;注意力機制的演進 之前我們介紹了 SE&#xff08;Squeeze-and-Excitation&#xff09;通道注意力模塊&#xff0c;其本質是對特征進行增強處理。現在&#…

iOS和桌面雙端抓包實戰經驗總結:Sniffmaster與常見工具組合解析

近幾年&#xff0c;移動端和桌面端的網絡調試工作變得越來越“棘手”。過去一個代理證書搞定的場景&#xff0c;現在常常被HTTPS加密、雙向驗證、App安全策略給難住。特別是涉及到iOS平臺時&#xff0c;很多傳統抓包方案都不再適用。作為一名在多個平臺開發和測試的程序員&…

cloudstudio騰訊云:matplotlib 設置中文字體

檢查可用字體&#xff1a; import matplotlib.font_manager as fm fonts [f.name for f in fm.fontManager.ttflist] print(fonts) # 查看系統中可用的字體列表# 列出所有中文字體文件 !fc-list :langzh沒有中文字體&#xff0c;需要下載 !sudo apt-get install fonts-wqy-m…

Django中的ORM的使用步驟----以MySQL為例

1 以純Python的形式創建項目虛擬環境 2 命令安裝Django 3 在當前虛擬環境目錄下命令創建Django項目 4 命令創建app 注&#xff1a; 若想將創建的子應用存放到指定目錄&#xff0c;如app&#xff0c; 那么需要先手動創建app目錄&#xff0c;再手動創建子應用目錄&#xff0c;如o…

Rust 學習筆記:通過 Send 和 Sync trait 實現可擴展并發性

Rust 學習筆記&#xff1a;通過 Send 和 Sync trait 實現可擴展并發性 Rust 學習筆記&#xff1a;通過 Send 和 Sync trait 實現可擴展并發性Send trait&#xff1a;允許在線程之間轉移所有權Sync trait&#xff1a;允許多線程訪問手動實現 Send 和 Sync 是不安全的練習題 Rust…

【C++】第十一節—一文詳解vector(使用+楊輝三角+深度剖析+模擬實現+細節詳細補充)

Hi&#xff0c;我是云邊有個稻草人&#xff0c;偶爾中二的C領域博主^(*&#xffe3;(oo)&#xffe3;)^&#xff0c;與你分享專業知識—— C_本篇博客所屬專欄—持續更新中—歡迎訂閱喔 目錄 一、vector的介紹及使用 1.1 vector的介紹 1.2 vector的使用 &#xff08;1&…

華為智選攜手IAM:突破技術邊界,重塑智慧健康家居新時代

華為智選與IAM的聯動創研&#xff0c;是科技與健康兩大領域深度結合的推動者&#xff0c;更是健康智能家電創新的引領者。他們不再只是產品的制造商&#xff0c;而是生活方式的革新者——用創新科技重構健康生活&#xff0c;用智慧生態重塑家居體驗。在這場深度的跨界融合中&am…

基于cornerstone3D的dicom影像瀏覽器 第三十一章 從PACS服務加載圖像

文章目錄 前言一、兩個服務接口1. 查詢檢查接口2. 查詢圖像接口 二、查詢界面組件三、修改歸檔總結 前言 "基于cornerstone3D的dicom影像瀏覽器"系列文章中都是加載本地文件夾的的dicom圖像。 作為一個合格的dicom影像瀏覽器需要對接PACS服務端&#xff0c;從PACS服…

STM32+rt-thread判斷是否聯網

一、根據NETDEV_FLAG_INTERNET_UP位判斷 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…