避免写入直接操作数据文件
如果数据的写入直接操作数据文件是非常危险的事情,例如当我转账到一半的时候突然发生了错误,这个时候账户扣款了100万,但是收账账户并没有增加100万,此时就会有问题
为了解决这种情况,MYSQL通过日志来实现间接写入;
MySQL总共有5种日志,其中只有redo日志和undo日志与事务有关
当我进行数据修改时,数据库首先会将数据拷贝到UNDO日志中,接着将记录修改保存在redo日志中,最后如果事务正常提交,则将redo中的数据同步到数据库数据文件中,如果出现情况回滚,则将日志文件中的数据做上标记,不再进行同步。
事务机制
有这么一种说法,叫做 RDBMS = SQL +事务;
事务是一个或者多个SQL语句组成的整体,要么全部执行成功,要么全都执行失败。
事务案例
例如:我要把10部门中MANGER员工调往20部门,其他岗位的员工调往30部门,然后删除10部门。
START TRANSACTION;
# 我要把10部门中MANGER员工调往20部门,其他岗位的员工调往30部门,然后删除10部门。
UPDATE t_emp E
SET deptno = IF(E.job="MANGER","20","30")
WHERE deptno = "10";
DELETE FROM t_dept
WHERE deptno ='10';
SELECT * FROM t_dept;
COMMIT;
此时就有两段sql语句,首先是更新员工表数据,然后删除部门表数据,此时为了保证数据的一致性,就需要将这两段sql放在一个事务中进行处理。
那么我们怎么对事务进行管理呢?
默认情况下,MySQL执行每条SQL语句都会自动开启和提交事务, 为了让多条SQL语句纳入到一个事务之下,可以手动管理事务。
事务的ACID属性
事务的原子性
一个事务中的所有操作要么全部完成,要么全部失败。事务执行后,不允许停留在中间某个状态
事务的一致性
-
不管在任何给定的时间、并发事务有多少,事务必须保证运行结果的一致性
-
事务可以并发执行,但是最终MySQL却串行执行.
隔离性
- 隔离性要求事务不受其他并发事务的影响,如同在给定的时间内,该事务是数据库唯一运行的事物
- 默认情况下A事务,只能看到日志中该事务的相关数据
持久性
事务一旦提交,结果便是永久性的。即便发生宕机,仍然可以依靠事务日志完成数据的持久化.
事务的四个隔离级别
下面,我们分场景来讲述一下这四个隔离级别的使用:
read uncommitted——读取未提交的数据
例如在A会话下有下列代码,在A事务中进行了更新操作,然后暂时不提交,接着设置B的隔离级别为READ UNCOMMITED;
# A事务
START TRANSACTION;
UPDATE t_emp
SET sal ="1008611";
COMMIT;
#B事务
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
SELECT * FROM t_emp;
COMMIT;
此时可以看到B查询的结果为
read committed
适用于下面这个场景:
例如,我现在引入C事务
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
SELECT * FROM t_emp;
COMMIT;
在A事务提交前获取的数据为:
在A事务提交后获取的数据为:
REPEATABLE READ ——重复读,它只会从自己事务的undo中获取数据
例如,我引入事务D:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT * FROM t_emp;
COMMIT;
在A事务提交后,D的查询结果为原结果
事务的序列化
由于事务并发执行所带来的各种问题,前三种隔离级别只适用在某些业务场景中,但是序列化的隔离性,让事务逐一执行,就不会产生上述问题了。
这里引入E:
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
SELECT * FROM t_emp;
COMMIT;
可以看到,在A事务提交前,E事务一直在等待。当A提交后,E事务才会执行.
一个事务中对同一数据做多次处理
一个事务中,先对数据+100,再对数据-200,最终提交后数据减少100
START TRANSACTION;
--数据+100
UPDATE t_salgrade SET losal=losal+100 where grade =1;
--数据,200
UPDATE t_salgrade SET losal =losal-200 where grade =1;
COMMIT;
数据导出与备份的区别
- 数据导出,导出的纯粹是业务数据
- 数据备份,备份的是数据文件、日志文件、索引文件等等
数据导出的分类:
数据少时采用sql文件导出,数据少时选择文本文档导出
导出sql文件
导入SQL文件
source命令用于导入SQL文件,包括创建数据表,写入记录等