MySQL 事务
封面图
•
2025-09-26
•
MySQL
173
0
0
0
MySQL 中的 **事务(Transaction)** 是一组 SQL 操作,这些操作要么全部成功执行,要么全部失败回滚。事务是数据库管理系统中用于保证数据一致性和完整性的机制。 --- ## 🧩 一、事务的四个特性(ACID) 事务必须满足以下四个特性: 1. **原子性(Atomicity)** 事务中的所有操作要么全部完成,要么全部不完成,不会出现部分完成的情况。 2. **一致性(Consistency)** 事务执行前后,数据库的完整性约束(如主键、外键、唯一性等)始终有效。 3. **隔离性(Isolation)** 多个事务并发执行时,一个事务的执行不会影响另一个事务的执行。 4. **持久性(Durability)** 一旦事务提交,其对数据库的修改就是永久性的,即使系统崩溃也不会丢失。 --- ## 🛠️ 二、MySQL 事务的基本操作 ### 1. 开始事务 ```sql START TRANSACTION; ``` ### 2. 提交事务 ```sql COMMIT; ``` ### 3. 回滚事务 ```sql ROLLBACK; ``` > ⚠️ 注意:`ROLLBACK` 只能回滚未提交的事务。 --- ## 💡 三、事务示例 假设有一个银行转账的操作,从账户 A 转 100 元到账户 B: ```sql START TRANSACTION; -- 从 A 账户扣除 100 UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A'; -- 向 B 账户增加 100 UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B'; -- 如果一切正常,提交事务 COMMIT; -- 如果出错,回滚事务 -- ROLLBACK; ``` --- ## 📌 四、事务的隔离级别 MySQL 支持四种事务隔离级别,用来控制事务之间的可见性和并发问题: | 隔离级别 | 描述 | |----------|------| | `READ UNCOMMITTED` | 最低级别,允许脏读、不可重复读、幻读 | | `READ COMMITTED` | 允许不可重复读和幻读 | | `REPEATABLE READ` | MySQL 默认级别,防止脏读和不可重复读,但可能有幻读(InnoDB 使用多版本并发控制解决幻读) | | `SERIALIZABLE` | 最高级别,完全串行化,避免所有并发问题 | ### 设置隔离级别: ```sql SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` --- ## 🔄 五、事务的自动提交(Autocommit) 默认情况下,MySQL 是开启自动提交的(`autocommit = 1`),即每条 SQL 语句都会被当作一个独立的事务自动提交。 ### 关闭自动提交: ```sql SET autocommit = 0; ``` ### 开启自动提交: ```sql SET autocommit = 1; ``` --- ## 🧪 六、使用事务的注意事项 - **事务必须使用支持事务的存储引擎**,如 InnoDB。 - 不要在事务中执行 `DDL`(如 `CREATE TABLE`, `ALTER TABLE`)操作,可能会导致事务提前提交。 - 尽量减少事务的范围,避免长时间占用锁。 - 在应用层处理异常,确保在出错时能够正确回滚。 --- ## 🧾 七、查看事务状态 ```sql SHOW VARIABLES LIKE 'autocommit'; SHOW STATUS LIKE 'INNODB_TRX'; -- 查看当前正在运行的事务 ``` --- ## ✅ 总结 | 项目 | 内容 | |------|------| | 事务特性 | ACID(原子性、一致性、隔离性、持久性) | | 事务命令 | `START TRANSACTION`, `COMMIT`, `ROLLBACK` | | 存储引擎 | InnoDB 支持事务 | | 隔离级别 | `READ UNCOMMITTED`, `READ COMMITTED`, `REPEATABLE READ`, `SERIALIZABLE` | | 自动提交 | 默认开启(`autocommit = 1`) | --- 如果你有具体的使用场景或遇到事务相关的问题,欢迎继续提问!
上一篇:
MySQL索引优化
下一篇:
MySQL读写分离
标题录入,一次不能超过6条
返回顶部
留言
留言
评论