为什么需要事务机制
-
避免写入直接操作数据文件写入直接操作数据文件是一件非常危险的事情,遇到突发事故,没有数据文件对比无法还原。
-
mysql五种日志文件,其中只有undo和redo日志与事务有关。
拷贝数据在undo日志中 记录修改在 redo 日志中
(图片)事务机制(一)2:10
事务机制
-
RDBMS = SQL语句 + 事务(ACID)
-
事务是一组sql语句当做一个整体要么全部成功要么全部失败。
(图片)事务机制(一)5:08
管理事务
-
先从数据库文件拷贝数据到undo日志,记录修改到redo日志,如果没有问题就同步数据到数据库文件。
-
开启事务,UPDATE语句,DELETE语句 提交事务。日志操作流程如下,拷贝数据到UNdo日志,update,delete后写入redo日志,undo日志可以用来恢复数据库,redo日志用来修改数据库。
-
默认情况下,MySQL执行每条SQL语句都会自动开启和提交事务
手动管理事务
语法:
STAT TRANSACTION;
SQL语句
[COMMIT(同步)|ROLLBACK(回滚)];
例子:
# 1、手动开启事务后删除 t_emp 和 t_dept中的数据
# 2、刷新表中数据,数据并没有消失
# 3、开启COMMIT,修改会同步到表中
START TRANSACTION;
DELETE FROM t_emp;
DELETE FROM t_dept;
SELECT * FROM t_emp;
COMMIT;
事务ACID特性
原子性:要么都成功要么都失败不允许停留在某个状态。
事务一致性:不管在任何给定的时间,并发事务有多少,事务必须保证运行结果的一致性
隔离性:隔离性要求事务不受其他并发事务的影响,如同在给定的时间内,该事务是数据库唯一运行的事物
持久性:事务一旦提交,结果便是永久性的。即便是宕机了,依然可以依靠事务日志完成数据的持久化。
事务的四个隔离级别
序号 | 隔离级别 | 功能 |
---|---|---|
1 | read uncommitted | 读取其他事务未提交的数据 |
2 | read committed | 读取其他事务已提交数据 |
3 | repeatable read | 重复读取 |
4 | serializable | 序列化 |
例子:
# 读取未提交的数据
START TRANSACTION;
UPDATE t_emp SET sal=1;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
SELECT empno,ename,sal FROM t_emp;
COMMIT;