← 返回目录

第 9 卷

第 9 / 12 卷日期:

  1. 事务的ACID特性(核心原则)
  2. 原子性(Atomicity):事务中的所有操作是一个不可分割的整体,要么全部执行,要么全部回滚

(撤销),不存在中间状态。例如:转账时,“用户A扣款”和“用户B到账”必须同时成功,若其中一步失败,整个事务回滚,数据恢复到初始状态。

  1. 一致性(Consistency):事务执行前后,数据的完整性约束(如主键唯一、外键关联)不被破

坏。例如:转账前A和B的总金额为1000元,转账后总金额仍为1000元。

  1. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不会被其他事务干扰,每个事务都感

觉不到其他事务的存在。MySQL通过隔离级别控制并发事务的干扰程度。

  1. 持久性(Durability):事务执行成功后,对数据的修改是永久性的,即使MySQL服务崩溃或服务

器断电,数据也不会丢失(通过事务日志保证)。

  1. MySQL中事务的管理方式

MySQL中只有InnoDB存储引擎支持事务,事务管理通过以下SQL语句实现,核心是“开启事务→执行 SQL→提交/回滚事务”:

  1. 开启事务:
  • 方式1: START TRANSACTION;(推荐,清晰易懂)
  • 方式2: BEGIN;(与START TRANSACTION功能一致)
  1. 执行事务内的SQL操作:执行一组DML语句(INSERT、UPDATE、DELETE),这些语句是事务的

核心操作。

示例(转账事务):

START TRANSACTION;

// 1. 用户A扣款100元(A的余额减少100)

UPDATE user SET balance = balance - 100 WHERE id = 1;

// 2. 用户B到账100元(B的余额增加100)
UPDATE user SET balance = balance + 100 WHERE id = 2;

  1. 提交事务:若所有SQL操作执行成功,通过 COMMIT; 提交事务,此时对数据的修改永久生效。

示例: COMMIT;(转账成功,数据永久保存)

  1. 回滚事务:若其中任意一条SQL执行失败,通过 ROLLBACK; 回滚事务,所有操作的修改全部撤

销,数据恢复到事务开启前的状态。

示例: ROLLBACK;(转账失败,A和B的余额恢复初始值)

  • 回滚到保存点: ROLLBACK TO 保存点名称;
  • 删除保存点: RELEASE SAVEPOINT 保存点名称;

示例:

START TRANSACTION;

UPDATE user SET balance = balance - 100 WHERE id = 1;

SAVEPOINT sp1; // 创建保存点sp1 UPDATE user SET balance = balance + 100 WHERE id = 2;

UPDATE user SET balance = balance + 50 WHERE id = 3; // 假设此操作失败 ROLLBACK TO sp1; // 回滚到sp1,仅撤销id=3的修改,id=1的修改保留

COMMIT; // 提交事务,最终仅id=1的修改生效

  1. MySQL的事务隔离级别

事务隔离级别用于控制并发事务之间的干扰,MySQL默认隔离级别为 REPEATABLE READ(可重复读),支持4种隔离级别(从低到高,隔离性越强,并发性能越弱):

  1. READ UNCOMMITTED(读未提交):最低隔离级别,一个事务可以读取另一个事务未提交的修

改。存在“脏读”问题(读取到未提交的无效数据),几乎不用。

  1. READ COMMITTED(读已提交):一个事务只能读取另一个事务已提交的修改。解决了“脏

读”问题,但存在“不可重复读”问题(同一事务内多次查询同一数据,结果可能不同,因为其他事务已提交修改)。适用于多数互联网场景(如电商商品详情查询)。

  1. REPEATABLE READ(可重复读):MySQL默认级别,同一事务内多次查询同一数据,结果始终一

致,不受其他事务提交的修改影响。解决了“不可重复读”问题,但存在“幻读”问题(同一事务内多次执行同一范围查询,结果行数可能不同,因为其他事务插入了新数据)。

  1. SERIALIZABLE(串行化):最高隔离级别,所有事务串行执行(同一时间只能执行一个事务),

完全避免了并发问题,但并发性能极差,适用于数据一致性要求极高的场景(如金融核心交易)。

查看当前隔离级别: SELECT @@transaction_isolation;

修改隔离级别: SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;(需重启会话生效)

十四、什么是索引?MySQL中有哪些类型的索引?

  1. 索引的核心定义

索引(Index)是MySQL中用于提升查询性能的一种数据结构(类似书籍的目录),它通过对表中的特定字段进行排序和存储,让MySQL无需遍历全表即可快速定位到目标数据,从而大幅提升查询效率。

能需遍历100万行,有索引仅需几次查找)。

  1. 保证数据唯一性:通过唯一索引(如主键索引)约束字段值的唯一性,避免重复数据。
  2. MySQL中常见的索引类型

按“数据结构”“功能”“存储方式”可分为不同类型,核心常用类型如下:

(1)按数据结构分类

  1. B+树索引:MySQL默认的索引数据结构,适用于范围查询、排序查询,所有数据都存储在叶子节

点,叶子节点之间通过链表连接,查询效率稳定。InnoDB和MyISAM均支持B+树索引,是最常用的索引类型。

  1. 哈希索引:基于哈希表实现,适用于等值查询(=、!=),查询速度极快(O(1)时间复杂度),但不

支持范围查询、排序查询。MySQL中Memory存储引擎默认使用哈希索引,InnoDB支持自适应哈希索引(自动为频繁查询的字段创建)。

  1. Full-Text索引(全文索引):专为文本搜索设计,支持对长文本字段(如VARCHAR、TEXT)进行

关键词匹配查询,适用于博客、新闻等内容检索场景。MySQL 5.6及以上版本的InnoDB支持全文索引。

  1. R-Tree索引(空间索引):用于存储空间数据(如地理位置、地图坐标),支持空间范围查询,适

用于GIS(地理信息系统)场景,使用较少。

(2)按功能分类

  1. 主键索引(Primary Key):最核心的索引,用于唯一标识表中的每条记录,一张表只能有一个主

键索引,字段值不能为空(NOT NULL)且唯一。创建表时通过 PRIMARY KEY 指定,InnoDB中主键索引是聚簇索引(索引与数据绑定)。

示例: CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT, ...);

  1. 唯一索引(Unique Index):保证字段值的唯一性,但允许字段值为NULL(一张表可多个唯一索

引)。适用于需要唯一约束但字段可能为空的场景(如用户手机号、邮箱)。

示例: CREATE UNIQUE INDEX idx_user_phone ON user(phone);

  1. 普通索引(Normal Index):最基础的索引,仅用于提升查询速度,无唯一性约束,字段值可重

复、可为空。适用于频繁查询的非唯一字段(如商品分类、用户年龄)。

示例: CREATE INDEX idx_user_age ON user(age);

  1. 复合索引(Composite Index):基于多个字段创建的索引,适用于多字段联合查询场景(如查

询“年龄25且性别男”的用户)。复合索引遵循“最左前缀匹配原则”(查询时必须包含最左侧字段,否则索引失效)。

示例: CREATE INDEX idx_user_age_gender ON user(age, gender);(支持age查

全站分卷索引 · 12 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷