第 9 卷
- 事务的ACID特性(核心原则)
- 原子性(Atomicity):事务中的所有操作是一个不可分割的整体,要么全部执行,要么全部回滚
(撤销),不存在中间状态。例如:转账时,“用户A扣款”和“用户B到账”必须同时成功,若其中一步失败,整个事务回滚,数据恢复到初始状态。
- 一致性(Consistency):事务执行前后,数据的完整性约束(如主键唯一、外键关联)不被破
坏。例如:转账前A和B的总金额为1000元,转账后总金额仍为1000元。
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不会被其他事务干扰,每个事务都感
觉不到其他事务的存在。MySQL通过隔离级别控制并发事务的干扰程度。
- 持久性(Durability):事务执行成功后,对数据的修改是永久性的,即使MySQL服务崩溃或服务
器断电,数据也不会丢失(通过事务日志保证)。
- MySQL中事务的管理方式
MySQL中只有InnoDB存储引擎支持事务,事务管理通过以下SQL语句实现,核心是“开启事务→执行 SQL→提交/回滚事务”:
- 开启事务:
- 方式1: START TRANSACTION;(推荐,清晰易懂)
- 方式2: BEGIN;(与START TRANSACTION功能一致)
- 执行事务内的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;
- 提交事务:若所有SQL操作执行成功,通过 COMMIT; 提交事务,此时对数据的修改永久生效。
示例: COMMIT;(转账成功,数据永久保存)
- 回滚事务:若其中任意一条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的修改生效
- MySQL的事务隔离级别
事务隔离级别用于控制并发事务之间的干扰,MySQL默认隔离级别为 REPEATABLE READ(可重复读),支持4种隔离级别(从低到高,隔离性越强,并发性能越弱):
- READ UNCOMMITTED(读未提交):最低隔离级别,一个事务可以读取另一个事务未提交的修
改。存在“脏读”问题(读取到未提交的无效数据),几乎不用。
- READ COMMITTED(读已提交):一个事务只能读取另一个事务已提交的修改。解决了“脏
读”问题,但存在“不可重复读”问题(同一事务内多次查询同一数据,结果可能不同,因为其他事务已提交修改)。适用于多数互联网场景(如电商商品详情查询)。
- REPEATABLE READ(可重复读):MySQL默认级别,同一事务内多次查询同一数据,结果始终一
致,不受其他事务提交的修改影响。解决了“不可重复读”问题,但存在“幻读”问题(同一事务内多次执行同一范围查询,结果行数可能不同,因为其他事务插入了新数据)。
- SERIALIZABLE(串行化):最高隔离级别,所有事务串行执行(同一时间只能执行一个事务),
完全避免了并发问题,但并发性能极差,适用于数据一致性要求极高的场景(如金融核心交易)。
查看当前隔离级别: SELECT @@transaction_isolation;
修改隔离级别: SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;(需重启会话生效)
十四、什么是索引?MySQL中有哪些类型的索引?
- 索引的核心定义
索引(Index)是MySQL中用于提升查询性能的一种数据结构(类似书籍的目录),它通过对表中的特定字段进行排序和存储,让MySQL无需遍历全表即可快速定位到目标数据,从而大幅提升查询效率。
能需遍历100万行,有索引仅需几次查找)。
- 保证数据唯一性:通过唯一索引(如主键索引)约束字段值的唯一性,避免重复数据。
- MySQL中常见的索引类型
按“数据结构”“功能”“存储方式”可分为不同类型,核心常用类型如下:
(1)按数据结构分类
- B+树索引:MySQL默认的索引数据结构,适用于范围查询、排序查询,所有数据都存储在叶子节
点,叶子节点之间通过链表连接,查询效率稳定。InnoDB和MyISAM均支持B+树索引,是最常用的索引类型。
- 哈希索引:基于哈希表实现,适用于等值查询(=、!=),查询速度极快(O(1)时间复杂度),但不
支持范围查询、排序查询。MySQL中Memory存储引擎默认使用哈希索引,InnoDB支持自适应哈希索引(自动为频繁查询的字段创建)。
- Full-Text索引(全文索引):专为文本搜索设计,支持对长文本字段(如VARCHAR、TEXT)进行
关键词匹配查询,适用于博客、新闻等内容检索场景。MySQL 5.6及以上版本的InnoDB支持全文索引。
- R-Tree索引(空间索引):用于存储空间数据(如地理位置、地图坐标),支持空间范围查询,适
用于GIS(地理信息系统)场景,使用较少。
(2)按功能分类
- 主键索引(Primary Key):最核心的索引,用于唯一标识表中的每条记录,一张表只能有一个主
键索引,字段值不能为空(NOT NULL)且唯一。创建表时通过 PRIMARY KEY 指定,InnoDB中主键索引是聚簇索引(索引与数据绑定)。
示例: CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT, ...);
- 唯一索引(Unique Index):保证字段值的唯一性,但允许字段值为NULL(一张表可多个唯一索
引)。适用于需要唯一约束但字段可能为空的场景(如用户手机号、邮箱)。
示例: CREATE UNIQUE INDEX idx_user_phone ON user(phone);
- 普通索引(Normal Index):最基础的索引,仅用于提升查询速度,无唯一性约束,字段值可重
复、可为空。适用于频繁查询的非唯一字段(如商品分类、用户年龄)。
示例: CREATE INDEX idx_user_age ON user(age);
- 复合索引(Composite Index):基于多个字段创建的索引,适用于多字段联合查询场景(如查
询“年龄25且性别男”的用户)。复合索引遵循“最左前缀匹配原则”(查询时必须包含最左侧字段,否则索引失效)。
示例: CREATE INDEX idx_user_age_gender ON user(age, gender);(支持age查
全站分卷索引 · 12 卷
- 1第 1 卷
- 2第 2 卷
- 四、Node.js中的非阻塞I/O(Non-blocking I/O)模型
- • 阻塞I/O:主线程发起I/O操作后,暂停执行所有代码,直到I/O操作完成(如传统的PHP文件读
- • 非阻塞I/O:主线程发起I/O操作后,立即返回一个状态(未完成),并继续执行后续代码;I/O操作
- • exports:是 module.exports 的一个引用(快捷方式),默认是一个空对象 {},只能通
- • module.exports:是模块的真正导出对象,Node.js最终导出的是 module.exports 的
- ◦ 若为相对路径( ./、 ../)或绝对路径,直接按路径查找对应
- ◦ 若为第三方模块(如 express),会在当前目录的 node_modules 文件夹中查找,若找不
- 3第 3 卷
- 4第 4 卷
- 5第 5 卷
- 6第 6 卷
- 7第 7 卷
- 8第 8 卷
- 9第 9 卷
- 10第 10 卷
- 11第 11 卷
- 12第 12 卷