概念
事务: 需要满足ACID是数据库操作
- Atomictiy 原子性
-
Isolation 隔离性
各状态的转换不能互相影响, 比如下图 是最低的隔离级别 READ UNCOMMITED 未提交读, 就会出错
- Consistency 一致性
就是数据库中的数据, 全部发河现实世界中的约束, 比如钱不能有负数, 各账号之间转账, 总钱数不变, 这些主要靠业务代码保证
原子性和隔离性没达到, 会导致一致性达不到
但是 原子性和隔离性 都达到了, 一致性也可能不满足 ,比如钱数为负数
- Durability 持久性
如前文所述, 修改了某UE只是写到buffer pool 缓存中, 要等某个时间点 后台线程把脏页刷到磁盘, 如果这段时间内系统崩溃了怎么办?
持久性要求, 状态转换成功就是成功了, 不能成功后, 因为任何原因, 又把状态还原了
事务的状态
- 部分提交: 内存中完成 , 还没刷到磁盘
- 终止的: 回滚还原后
如图 只有 提交的
和 中止的
是结束了
事务相关语法
BEGIN;
UPDATE account SET balance = balance - 10 WHERE id = 1;
UPDATE account SET balance = balance + 10 WHERE id = 2;
COMMIT;
BEGIN;
开始事务
可以换成
START TRANSACTION;
更加强大, 因为START TRANSACTION;可以带修饰符 只读/可读写/一致性读
默认每条sql是一个事务
自动提交
autocommit
默认是 ON, 可以关
COMMIT;
提交事务, 提交以后就是成了 , 要保证持久性
程序员主动回滚
没发错错误, 只是想手动回滚, 用ROLLBACK;
BEGIN;
UPDATE account SET balance = balance - 10 WHERE id = 1;
UPDATE account SET balance = balance + 1 WHERE id = 2;
ROLLBACK;
只主动回滚一部分 ROLLBACK TO s1
s1是之前设的保存点
BEGIN;
UPDATE account SET balance = balance - 10 WHERE id = 1;
SAVEPOINT s1; # 一个保存点
SELECT * FROM account;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| 1 | 狗哥 | 1 |
| 2 | 猫爷 | 2 |
+----+--------+---------+
2 rows in set (0.00 sec)
UPDATE account SET balance = balance + 1 WHERE id = 2; # 更新错了
ROLLBACK TO s1; # 回滚到保存点s1处
隐式提交
一些语句自带COMMIT;
的效果
比如 再开始一个事务BEGIN;
会自动把上一个提交
对表结构的修改, 会把没提交的事务提交
批量往数据库中导入数据时, 会把之前没提交的事务提交