MySQL⑤事务
事务 Transaction
事务:一组操作的集合,是不可分割的工作单位。
- 事务会把所有操作,作为一个整体向系统提交或撤销请求。
- 要么同时成功,要么同时失败。
- 例:转账
MySQL 默认自动提交事务
即每执行一条 DML 语句,MySQL 立即将事务提交到数据库。
1、事务操作
-
控制事务
# 方式一:关闭自动提交事务 SET @@autocommit = 0; # 方式二:开启事务(建议) START TRANSCATION 或 BEGIN; -
提交 / 回滚事务
# 事务正常时提交 COMMIT; # 事务异常时回滚 ROLLBACK;
2、ACID 四大特性(!)
- 原子性(Atomicity):事务是不可分割的最小操作单元(要么都成功,要么都失败)
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态(要么都提交,要么都不提交)
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在独立环境下运行,不受外部并发操作影响。
- 持久性(Durability):事务一旦提交或回滚,结果就被持久化到存储器中。
3、并发事务
多个事务并发操作数据库时,会出现以下问题。
| 含义 | 原因 / 后果 | |
|---|---|---|
| 脏读 | 一个事务读到另一个事务未提交的数据 | 事务 A 读到一行记录发现未修改,实际上是 事务 B 未提交 |
| 不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同 | 事务 B 在事务 A 查询之后。修改了记录 |
| 幻读 | 一个事务按条件查询数据时,没有对应的记录;在插入对应记录时,又发现这行数据已经存在。 | 事务 B 在事务 A 查询之后,插入了满足相应条件的记录 |
4、隔离级别
数据安全性与隔离级别成正比,性能与隔离级别成反比。
- Read uncommitted(读未提交)
- Read committed(读已提交)
- Repeatable Read(可重复读)
- Serializable(序列化)
?表示该隔离级别解决的问题
| 脏读 | 不可重复读 | 幻读 | |
|---|---|---|---|
| RU | - | - | - |
| RC | ? | - | - |
| RR(MySQL 默认) | ? | ? | - |
| Serializable | ? | ? | ? |