最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql事務(wù)與存儲引擎全解(概念、原理、代碼示例)

 更新時間:2026年04月10日 10:07:07   作者:羊小蜜.  
本文講解了MySQL事務(wù)與存儲引擎的相關(guān)知識點,圍繞圖片中的知識點,從概念、原理、代碼示例三個維度,帶你徹底掌握 MySQL 事務(wù)與存儲引擎,感興趣的朋友跟隨小編一起看看吧

在 MySQL 中,事務(wù)是保證數(shù)據(jù)一致性的核心機制,存儲引擎則是 MySQL 處理數(shù)據(jù)的底層引擎,兩者是數(shù)據(jù)庫開發(fā)、面試的高頻考點。本文圍繞圖片中的知識點,從概念、原理、代碼示例三個維度,帶你徹底掌握 MySQL 事務(wù)與存儲引擎。

一、核心知識點總覽

大類細分知識點核心作用
事務(wù)基礎(chǔ)1. 事務(wù)引例理解事務(wù)的實際應(yīng)用場景
2. 相關(guān)概念事務(wù)的定義、執(zhí)行流程
3. 存儲引擎事務(wù)與存儲引擎的依賴關(guān)系
4. ACID 屬性事務(wù)的四大核心特性(面試必背)
5. 銀行轉(zhuǎn)賬演示事務(wù)的實際代碼實戰(zhàn)
事務(wù)并發(fā)與隔離6. 事務(wù)的并發(fā)問題臟讀、不可重復(fù)讀、幻讀
7. 事務(wù)隔離性四大隔離級別
8. 隔離級別總結(jié)隔離級別對比、MySQL 默認級別
9. 隔離級別演示不同隔離級別下的問題演示
存儲引擎10. 存儲引擎InnoDB、MyISAM 等核心引擎對比

二、一、事務(wù)基礎(chǔ):從概念到 ACID

1. 事務(wù)是什么?

事務(wù)(Transaction)是一組不可分割的 SQL 操作單元,要么全部執(zhí)行成功,要么全部執(zhí)行失敗,保證數(shù)據(jù)的一致性。

經(jīng)典場景:銀行轉(zhuǎn)賬(A 給 B 轉(zhuǎn)錢,A 扣錢和 B 加錢必須同時成功 / 失?。?/p>

2. 事務(wù)的執(zhí)行流程

-- 開啟事務(wù)
START TRANSACTION;  -- 或 BEGIN;
-- 執(zhí)行SQL操作
UPDATE account SET money = money - 100 WHERE name = 'A';
UPDATE account SET money = money + 100 WHERE name = 'B';
-- 提交事務(wù)(全部生效)
COMMIT;
-- 回滾事務(wù)(全部撤銷,出現(xiàn)異常時執(zhí)行)
ROLLBACK;

3. 事務(wù)的 ACID 屬性

事務(wù)必須滿足四大核心特性,簡稱 ACID

屬性全稱核心含義
AAtomicity(原子性)事務(wù)是不可分割的最小單元,要么全成功,要么全失敗
CConsistency(一致性)事務(wù)執(zhí)行前后,數(shù)據(jù)的完整性約束不變(如轉(zhuǎn)賬前后總金額不變)
IIsolation(隔離性)多個事務(wù)并發(fā)執(zhí)行時,互不干擾,互不影響
DDurability(持久性)事務(wù)提交后,數(shù)據(jù)永久寫入數(shù)據(jù)庫,不會丟失

4. 銀行轉(zhuǎn)賬的事務(wù)演示(代碼實戰(zhàn))

準備工作:創(chuàng)建賬戶表

CREATE TABLE account (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    money DECIMAL(10,2) NOT NULL
) ENGINE=InnoDB; -- 必須用InnoDB(支持事務(wù))
INSERT INTO account (name, money) VALUES
('A', 1000.00),
('B', 500.00);

事務(wù)轉(zhuǎn)賬代碼

-- 開啟事務(wù)
START TRANSACTION;
-- A扣100
UPDATE account SET money = money - 100 WHERE name = 'A';
-- 模擬異常(手動報錯,測試回滾)
-- SELECT 1/0;
-- B加100
UPDATE account SET money = money + 100 WHERE name = 'B';
-- 提交事務(wù)
COMMIT;
-- 若出現(xiàn)異常,執(zhí)行回滾
-- ROLLBACK;
-- 查看結(jié)果
SELECT * FROM account;

結(jié)果說明

  • 正常執(zhí)行:A 余額 900,B 余額 600,總金額 1500 不變(一致性)
  • 異?;貪L:兩條 UPDATE 全部撤銷,A、B 余額不變(原子性)

三、二、事務(wù)并發(fā)問題與隔離級別

1. 事務(wù)的三大并發(fā)問題

多個事務(wù)同時操作同一數(shù)據(jù)時,會出現(xiàn)以下問題:

問題核心含義危害
臟讀一個事務(wù)讀取了另一個事務(wù)未提交的數(shù)據(jù),后續(xù)該事務(wù)回滾,讀取的數(shù)據(jù)無效讀取到錯誤數(shù)據(jù)
不可重復(fù)讀一個事務(wù)內(nèi)兩次讀取同一數(shù)據(jù),中間被另一個事務(wù)修改,兩次讀取結(jié)果不一致同一事務(wù)內(nèi)數(shù)據(jù)不一致
幻讀一個事務(wù)內(nèi)兩次查詢同一范圍數(shù)據(jù),中間被另一個事務(wù)插入 / 刪除數(shù)據(jù),兩次查詢結(jié)果行數(shù)不一致數(shù)據(jù)行數(shù)不一致,像 “幻覺”

2. 四大事務(wù)隔離級別(解決并發(fā)問題)

MySQL 通過隔離級別控制事務(wù)的隔離程度,級別越高,并發(fā)問題越少,但性能越低:

隔離級別英文解決的問題臟讀不可重復(fù)讀幻讀MySQL 默認
讀未提交READ UNCOMMITTED最低級別,無隔離? 存在? 存在? 存在
讀已提交READ COMMITTED僅讀取已提交數(shù)據(jù)? 避免? 存在? 存在否(Oracle 默認)
可重復(fù)讀REPEATABLE READ同一事務(wù)內(nèi)數(shù)據(jù)重復(fù)讀取一致? 避免? 避免? 存在(MySQL 特殊優(yōu)化)? 是(MySQL 默認)
串行化SERIALIZABLE事務(wù)串行執(zhí)行,完全隔離? 避免? 避免? 避免

MySQL 特殊說明:InnoDB 在 REPEATABLE READ 級別下,通過 MVCC(多版本并發(fā)控制) 避免了幻讀,是 MySQL 的默認級別,兼顧性能與一致性。

3. 隔離級別演示(核心場景)

(1)讀未提交(READ UNCOMMITTED):臟讀演示

-- 事務(wù)1:開啟事務(wù),修改數(shù)據(jù)但不提交
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
UPDATE account SET money = 900 WHERE name = 'A';
-- 事務(wù)2:讀取A的余額(讀到了未提交的數(shù)據(jù),臟讀)
START TRANSACTION;
SELECT money FROM account WHERE name = 'A'; -- 結(jié)果:900
-- 事務(wù)1:回滾
ROLLBACK;
-- 事務(wù)2:再次讀取,結(jié)果變回1000(臟讀導(dǎo)致數(shù)據(jù)不一致)
SELECT money FROM account WHERE name = 'A'; -- 結(jié)果:1000

(2)讀已提交(READ COMMITTED):不可重復(fù)讀演示

-- 事務(wù)1:開啟事務(wù)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
-- 第一次讀取A的余額
SELECT money FROM account WHERE name = 'A'; -- 結(jié)果:1000
-- 事務(wù)2:修改并提交
START TRANSACTION;
UPDATE account SET money = 900 WHERE name = 'A';
COMMIT;
-- 事務(wù)1:第二次讀取,結(jié)果變?yōu)?00(不可重復(fù)讀)
SELECT money FROM account WHERE name = 'A'; -- 結(jié)果:900

(3)可重復(fù)讀(REPEATABLE READ):避免不可重復(fù)讀,幻讀演示

-- 事務(wù)1:開啟事務(wù)(默認級別)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
-- 第一次查詢余額>800的記錄
SELECT * FROM account WHERE money > 800; -- 結(jié)果:A(1000)
-- 事務(wù)2:插入新記錄并提交
START TRANSACTION;
INSERT INTO account (name, money) VALUES ('C', 900.00);
COMMIT;
-- 事務(wù)1:第二次查詢,結(jié)果仍為A(1000)(MySQL MVCC避免幻讀)
SELECT * FROM account WHERE money > 800;
-- 若手動關(guān)閉MVCC,會出現(xiàn)幻讀(第二次查詢出現(xiàn)C的記錄)

(4)串行化(SERIALIZABLE):完全避免所有問題

-- 事務(wù)1:開啟串行化隔離級別
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
SELECT * FROM account;
-- 事務(wù)2:嘗試修改數(shù)據(jù),會被阻塞,直到事務(wù)1提交/回滾
START TRANSACTION;
UPDATE account SET money = 900 WHERE name = 'A'; -- 阻塞

四、三、存儲引擎詳解

1. 什么是存儲引擎?

存儲引擎是 MySQL 處理數(shù)據(jù)的底層組件,負責(zé)數(shù)據(jù)的存儲、提取、事務(wù)管理等,MySQL 支持多種存儲引擎,不同引擎特性不同。

2. 核心存儲引擎對比(面試必背)

存儲引擎事務(wù)支持外鍵支持鎖粒度適用場景
InnoDB? 支持? 支持行級鎖事務(wù)型業(yè)務(wù)(如銀行、電商),MySQL 5.5+ 默認引擎
MyISAM? 不支持? 不支持表級鎖讀多寫少的場景(如日志、報表),不支持事務(wù)
Memory? 不支持? 不支持表級鎖臨時表、緩存,數(shù)據(jù)存儲在內(nèi)存中,重啟丟失
Archive? 不支持? 不支持行級鎖歸檔存儲,高壓縮比,僅支持插入 / 查詢

3. 存儲引擎相關(guān)操作

-- 查看MySQL支持的存儲引擎
SHOW ENGINES;
-- 查看表的存儲引擎
SHOW TABLE STATUS LIKE 'account';
-- 修改表的存儲引擎
ALTER TABLE account ENGINE = MyISAM;
-- 創(chuàng)建表時指定存儲引擎
CREATE TABLE test (
    id INT PRIMARY KEY
) ENGINE=InnoDB;

4. InnoDB 核心特性

  • 支持事務(wù)、外鍵、行級鎖、MVCC
  • 支持崩潰恢復(fù),保證數(shù)據(jù)安全
  • 是 MySQL 生產(chǎn)環(huán)境的首選引擎

五、核心總結(jié)(面試速記)

1. 事務(wù)核心

  • ACID:原子性、一致性、隔離性、持久性
  • 并發(fā)問題:臟讀、不可重復(fù)讀、幻讀
  • 隔離級別:讀未提交 → 讀已提交 → 可重復(fù)讀(MySQL 默認) → 串行化
  • 事務(wù)語法START TRANSACTION / BEGINCOMMIT / ROLLBACK

2. 存儲引擎核心

  • InnoDB:默認引擎,支持事務(wù)、外鍵、行鎖,適用于事務(wù)型業(yè)務(wù)
  • MyISAM:不支持事務(wù),讀性能高,適用于讀多寫少場景
  • 事務(wù)僅 InnoDB 支持,MyISAM 無事務(wù)能力

六、避坑指南

  1. 事務(wù)依賴存儲引擎:只有 InnoDB 支持事務(wù),MyISAM 執(zhí)行事務(wù)語句不會報錯,但不會生效
  2. 隔離級別設(shè)置SET SESSION 僅對當(dāng)前會話生效,全局設(shè)置需修改 my.cnf
  3. 幻讀在 MySQL 中的特殊處理:InnoDB 默認級別 REPEATABLE READ 下,通過 MVCC 避免了幻讀,與標準 SQL 不同
  4. 事務(wù)回滾時機:必須在 COMMIT 之前執(zhí)行,提交后無法回滾

到此這篇關(guān)于Mysql事務(wù)與存儲引擎全解(概念、原理、代碼示例)的文章就介紹到這了,更多相關(guān)mysql事務(wù)與存儲引擎內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

绥德县| 瓮安县| 澳门| 称多县| 迁安市| 南丹县| 海原县| 五峰| 溆浦县| 麻阳| 定边县| 罗平县| 柳林县| 突泉县| 阿鲁科尔沁旗| 崇文区| 合川市| 蒙山县| 清徐县| 黎城县| 江津市| 文安县| 寿宁县| 浦东新区| 灌南县| 平乐县| 环江| 读书| 龙海市| 平度市| 沅江市| 龙泉市| 江城| 乌鲁木齐县| 拜城县| 桂东县| 云林县| 武山县| 离岛区| 富川| 尼玛县|