事务简介
- 事务是加在一段代码上的约束,使得这一段业务逻辑代码要么全部执行成功,要么执行失败回滚到事务开始状态。
死锁简介
- 多个事务相互占用着彼此所需要的资源,造成每一个事务都在等待的局面。
事务的ACID原则
原子性(atomicity)
- 事务是一组不可分割的操作单元,这组单元要么同时成功要么同时失败
一致性(consistency)
- 事务前后的数据完整性要保持一致
隔离性(isolation)
隔离级别
- 读未提交(READ UNCOMMITTED)
一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且还能看到其他事务没有提交的对已有记录的更新。会出现脏读的问题。 - 读已提交(READ COMMITTED)
一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且还能看到其他事务已经提交的对已有记录的更新。会出现不可重复读的问题。 - 可重复读(REPEATABLE READ)
一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。会出现幻读的情况。 - 串行化(SERIALIZABLE)
一个事务在执行过程中完全看不到其他事务对数据库所做的更新。当两个事务同时操作数据库中相同数据时,如果第一个事务已经在访问该数据,第二个事务只能停下来等待,必须等到第一个事务结束后才能恢复运行。因此这两个事务实际上是串行化方式运行。
- 事务隔离的提出是为了解决脏读、不可重复读、幻读这几个问题,4种隔离级别对这三个问题的解决程度如下:
脏读
脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。
不可重复读
对比可重复读,不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对数据更新(UPDATE)操作。
- 可重复读
可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。
幻读
幻读是针对数据插入(INSERT)操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。
持久性(durability)
- 内存中的数据存储到硬盘中是事务结束的标志
事务基本语法
# 开启事务
START TRANSACTION;
UPDATE student_info SET s_grade = 17 WHERE id = 1;
insert into student_info(id, s_name, s_age) VALUES(16, 'abcd', 22);
# 提交事务
COMMIT; # 当中间执行出现错误时,自动回滚
# 或者
ROLLBACK; # 回滚事务
# handler控制器,捕获异常
DECLARE t_error INT;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error = 1;
# 开始事务
START TRANSACTION;
# 业务逻辑代码
# 。。。。。。
# 异常判断
IF t_error = 1 THEN
ROLLBACK;
SELECT 0 AS run_code;
ELSE
COMMIT;
SELECT 1 as run_code;
END IF;
触发器
- 为什么不用触发器?
- 不符合高内聚、低耦合的编程思想
- 执行效率低下