MySQL 核心进阶:事务、隔离级别与视图实战
引言在上一篇文章中我们学习了 MySQL 的安装配置、基本 SQL 操作以及 C 语言连接数据库。本文将继续深入讲解 MySQL 的核心高级特性事务与隔离级别、视图、以及复杂查询的基础。这些是面试中的高频考点也是实际项目开发中保证数据一致性的关键技术。第一部分MySQL 体系结构一、整体架构组件功能连接池管理客户端连接支持高并发SQL 解析器词法分析、语法分析优化器选择最优执行计划如索引选择存储引擎负责数据读写可插拔默认 InnoDB文件系统数据最终持久化到磁盘第二部分C 语言查询数据一、完整查询流程#include stdio.h #include stdlib.h #include mysql/mysql.h int main() { // 1. 初始化连接句柄 MYSQL *conn mysql_init(NULL); if (conn NULL) { fprintf(stderr, mysql_init 失败\n); return -1; } // 2. 连接数据库 if (mysql_real_connect(conn, 127.0.0.1, root, 123456, c1100db, 3306, NULL, 0) NULL) { fprintf(stderr, 连接失败: %s\n, mysql_error(conn)); mysql_close(conn); return -1; } printf(数据库连接成功\n); // 3. 执行查询 const char *sql SELECT * FROM student; if (mysql_query(conn, sql) ! 0) { fprintf(stderr, 查询失败: %s\n, mysql_error(conn)); mysql_close(conn); return -1; } // 4. 获取结果集 MYSQL_RES *result mysql_store_result(conn); if (result NULL) { fprintf(stderr, 获取结果失败: %s\n, mysql_error(conn)); mysql_close(conn); return -1; } // 5. 获取行数和列数 int num_rows mysql_num_rows(result); unsigned int num_fields mysql_num_fields(result); printf(行数: %d, 列数: %d\n, num_rows, num_fields); // 6. 逐行逐列打印 MYSQL_ROW row; while ((row mysql_fetch_row(result))) { for (unsigned int j 0; j num_fields; j) { printf(%s\t, row[j] ? row[j] : NULL); } printf(\n); } // 7. 释放结果集和连接 mysql_free_result(result); mysql_close(conn); return 0; }编译运行gcc query.c -o query -lmysqlclient./query二、结果集处理要点API作用返回值mysql_store_result()获取结果集MYSQL_RES*失败返回 NULLmysql_num_rows()获取行数intmysql_num_fields()获取列数unsigned intmysql_fetch_row()逐行读取MYSQL_ROW读完返回 NULLmysql_free_result()释放结果集无重要提示MYSQL_ROW本质是char**所有值都是字符串形式数值型数据需要手动转换如atoi(row[0])结果集用完后必须调用mysql_free_result()释放第三部分事务一、什么是事务事务是一组 SQL 语句组成的原子操作单元要么全部执行成功要么全部回滚。二、ACID 特性特性说明举例原子性 (Atomicity)事务是不可分割的最小单元转账的两步要么都成要么都不成一致性 (Consistency)事务前后数据状态保持一致转账前后总金额不变隔离性 (Isolation)事务之间互不干扰A 转账时 B 看不到中间状态持久性 (Durability)提交后数据永久保存断电重启后数据不丢失面试重点能够解释 ACID 四个特性及其含义。三、事务操作命令-- 开启事务 BEGIN; -- 或 START TRANSACTION; -- 执行 SQL 操作... INSERT INTO student VALUES (1005, 小王, 22); UPDATE student SET age 23 WHERE id 1005; -- 提交事务永久保存 COMMIT; -- 回滚事务撤销所有操作 ROLLBACK;四、C 语言中控制事务// 开启事务 mysql_query(conn, BEGIN); // 执行多条 SQL mysql_query(conn, UPDATE account SET balance balance - 1000 WHERE id 1); mysql_query(conn, UPDATE account SET balance balance 1000 WHERE id 2); // 提交事务 mysql_query(conn, COMMIT); // 如果出错回滚 // mysql_query(conn, ROLLBACK);第四部分隔离级别一、四种隔离级别隔离级别脏读不可重复读幻读隔离性READ UNCOMMITTED未提交读✅✅✅最低READ COMMITTED提交读❌✅✅中REPEATABLE READ可重复读❌❌✅较高SERIALIZABLE可串行化❌❌❌最高三种并发问题二、查看和设置隔离级别-- 查看当前会话隔离级别SELECT transaction_isolation;-- 查看全局隔离级别SELECT global.transaction_isolation;-- 设置会话隔离级别SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;-- 设置全局隔离级别SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;三、可重复读 (REPEATABLE READ) 演示这是 MySQL 默认的隔离级别。四、提交读 (READ COMMITTED) 演示五、隔离级别选择建议场景推荐级别原因银行转账SERIALIZABLE数据一致性要求极高订单系统REPEATABLE READ默认平衡性能与一致性报表查询READ COMMITTED需要看到最新已提交数据日志记录READ UNCOMMITTED性能优先允许少量不一致第五部分视图一、什么是视图视图是虚拟表不存储实际数据数据来源于基本表的查询结果。二、视图操作-- 1. 创建视图 CREATE VIEW stu_view AS SELECT id, name FROM student; -- 2. 查询视图和查表完全一样 SELECT * FROM stu_view; SELECT * FROM stu_view WHERE id 1001; -- 3. 查看所有表含视图 SHOW FULL TABLES; -- Base Table → 基本表 -- View → 视图 -- 4. 删除视图不影响基本表数据 DROP VIEW stu_view;三、视图的优缺点优点缺点保护数据安全隐藏敏感字段不存储数据每次查询需重新执行简化复杂查询封装多表联查性能低于直接查询基本表减少数据冗余复杂视图可能降低查询效率灵活调整展示格式部分视图不可更新第六部分索引简介索引是提升查询性能的核心手段底层通常采用B树数据结构。-- 创建索引 CREATE INDEX idx_name ON student(name); -- 查看索引 SHOW INDEX FROM student; -- 删除索引 DROP INDEX idx_name ON student;总结一、事务与隔离级别要点说明事务操作BEGIN → 执行SQL → COMMIT/ROLLBACKACID原子性、一致性、隔离性、持久性默认隔离级别REPEATABLE READ可重复读隔离级别排序UNCOMMITTED COMMITTED REPEATABLE SERIALIZABLE二、视图CREATE VIEW 视图名 AS SELECT ... DROP VIEW 视图名; -- 视图不存数据本质是封装的 SELECT 语句三、C 语言查询数据mysql_init → mysql_real_connect → mysql_query → mysql_store_result → mysql_fetch_row (循环) → mysql_free_result → mysql_close四、一句话记忆事务保证一组 SQL 要么全做要么全不做ACID隔离级别控制事务之间的可见性默认可重复读视图是封装好的虚拟表用于保护数据和简化查询索引通过 B树加速查询但增删改时会付出维护代价。

相关新闻

最新新闻

日新闻

周新闻

月新闻