Skip to content

事务

ACID 特性

事务是数据库的逻辑工作单元,包含一组操作,确保数据一致性和完整性:

  • 原子性(Atomicity):事务中所有操作要么全部成功,要么全部失败。
  • 一致性(Consistency):事务执行后,数据库从一个合法状态转换到另一个合法状态。
  • 隔离性(Isolation):并发执行的事务相互隔离,互不干扰。
  • 持久性(Durability):事务提交后,对数据库的更改是永久性的。

事务使用步骤

  1. 关闭自动提交
    sql
    SET autocommit = 0;  -- 关闭自动提交
  2. 开启事务(可选):
    sql
    START TRANSACTION;
  3. 执行 SQL 操作:增删改查。
  4. 结束事务:提交或回滚。
查看自动提交状态
sql
SHOW VARIABLES LIKE 'autocommit';

事务操作

  • 提交事务:永久保存更改。
    sql
    COMMIT;
  • 回滚事务:撤销未提交的操作。
    sql
    ROLLBACK;
  • 事务保存点:设置还原点。
    sql
    SAVEPOINT savepoint_name;  -- 例如:SAVEPOINT one_change;
    • 回滚到保存点
      sql
      ROLLBACK TO savepoint_name;

      注意:回滚后,后续保存点将被销毁。

事务并发问题

问题描述
脏读事务 T1 读取了 T2 未提交的数据,若 T2 回滚,T1 读取的数据无效。
不可重复读事务 T1 多次读取同一字段,期间 T2 更新并提交了该字段,导致 T1 读取结果不一致。
幻读事务 T1 多次读取同一表,期间 T2 插入新记录,导致 T1 读取到额外记录。

MySQL 事务隔离级别

隔离级别描述解决并发问题
READ UNCOMMITTED读未提交数据
READ COMMITTED读已提交数据(默认)脏读
REPEATABLE READ可重复读脏读、不可重复读
SERIALIZABLE串行化脏读、不可重复读、幻读
设置隔离级别
sql
-- 会话级设置  
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;  
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;  
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;  
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
查看当前隔离级别
sql
SELECT @@transaction_isolation;

索引

索引用于加速数据查询(类似书籍目录):

  • 优点:加快查询速度,减少全表扫描,提升系统性能。
  • 缺点:过多索引会增加插入、更新、删除的开销。

索引类型

类型关键字描述适用场景
全文索引FULLTEXT对文本字段分词索引,支持关键词搜索。文章内容、评论等大文本搜索
空间索引SPATIAL优化地理空间数据查询(点、线、多边形)。地理信息系统(GIS)、地图应用
唯一索引UNIQUE确保字段值唯一。主键、用户 ID 等唯一性字段
普通索引无关键字加速查询,允许字段值重复。频繁作为查询条件的非唯一字段
复合索引多字段组合基于多个字段创建索引。查询条件涉及多个字段的组合

创建索引

1. 建表时创建
sql
CREATE TABLE 表名 (  
    字段1 类型,  
    字段2 类型,  
    -- 唯一索引  
    UNIQUE INDEX 索引名 (字段),  
    -- 复合索引  
    INDEX 索引名 (字段1, 字段2)  
);

示例

sql
CREATE TABLE students (  
    id INT PRIMARY KEY AUTO_INCREMENT,  
    name VARCHAR(255),  
    UNIQUE INDEX unique_name (name)  -- 为 name 字段创建唯一索引  
);
2. 建表后添加
sql
-- 方式1  
ALTER TABLE 表名 ADD INDEX 索引名 (字段);  
-- 方式2  
CREATE INDEX 索引名 ON 表名 (字段);

示例

sql
ALTER TABLE students ADD INDEX english_index (english);  
CREATE INDEX english_index ON students (english);

查看索引

sql
SHOW INDEX FROM 表名;

删除索引

sql
-- 方式1  
DROP INDEX 索引名 ON 表名;  
-- 方式2  
ALTER TABLE 表名 DROP INDEX 索引名;

数据迁移与备份

备份数据库

bash
mysqldump -u 用户名 -p 数据库名 > 备份文件名.sql

示例

bash
mysqldump -u root -p mydb > mydb_backup.sql

迁移数据库

bash
mysql -u 用户名 -p 数据库名 < 备份文件名.sql

示例

bash
mysql -u root -p newdb < mydb_backup.sql

关键提示

  • 事务确保数据操作的原子性和一致性。
  • 索引提升查询效率,但需平衡读写性能。
  • 定期备份防止数据丢失。

知识如风,常伴吾身