MYSQL——事务机制与导入导出

4 篇文章 0 订阅
1 篇文章 0 订阅

避免写入直接操作数据文件

如果数据的写入直接操作数据文件是非常危险的事情,例如当我转账到一半的时候突然发生了错误,这个时候账户扣款了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文件,包括创建数据表,写入记录等
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知虚

权当做笔记,打赏随您心意

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值