MySQL——事务

1. 事务

1.1 为什么使用事务

场景:张三给李四转账500元

上述操作必须两个 sql 都执行完毕,转账才能完成

若程序执行第一个操作后,执行第二个操作前,出现了严重问题(如:程序崩溃、主机断电...),就会出现张三钱被扣了,但李四没收到的“转账转一半”的情况

1.2 回滚机制 及 事务的“原子性”

事务,就是用来解决类似上述场景的,相当于将多个要执行的 sql 打包成一个整体,这个整体在执行过程中要么整个执行完,要么一个都不执行

此处的“一个都不执行”不是这些 sql 真的没执行,而是执行一半发生错误的时候,数据库会自动进行“还原操作”,相当于把前面执行过的 sql 给进行“撤销”,最终的效果就看起来好像一个都没执行,这样的机制称为“回滚(rollback)”,同时也把事务支持的上述“特性”称为“原子性”

1.3 “回滚”原理

数据库内部存在一系列的“日志体系”,记录到“文件中”,当开启事务的时候,此时每一步执行的 sql ,对数据进行了哪些修改,这些信息就会记录在案,后续如果需要回滚,就可以参考记录的内容,进行还原

tip:drop database 这样的操作属于“正确执行了 sql”,不能通过回滚还原

1.4 使用

1) 开启事务:start transaction;

2) 执行多条 SQL 语句

3) 回滚或提交:rollback / commit;

tip:rooback是全部失败,commit是全部成功

1.5 事务的四个核心特性

1) 原子性(最重要的特性)

2) 一致性

事务执行前和执行后,数据库中的数据,都是“合法状态”,不会出现非法的临时结果的状态

3) 持久性

事务执行完毕之后,就会修改硬盘上的数据,事务都是持久生效的

4) 隔离性(面试高频)

隔离性,描述了多个事务并发执行时,相互之间产生的影响时怎样的

1.6 并发执行事务涉及到的三个问题

MySQL是一个“客户端--服务器”结构的程序,一个服务器通常会给多个客户端同时提供服务,因此很可能这多个客户端会同时给这个服务器提交事务来执行,与之相对,服务器就需要同时执行这多个事务,此时就是“并发”执行

此时,如果这些同时执行的事务,恰好也是针对同一个表,进行一些增删查改,就会引入一些问题

1) 脏读

场景:有两个事务 A 和 B 并发执行

其中事务 A 在针对某个表的数据进行修改

A 执行过程中,B 也去读这个表的数据

当 B 读完之后,A 把表中的数据改为了别的

这就导致 B 读到的数据不是最终的“正确数据”

而是读到了临时性的“脏数据”(脏数据指数据过期、过时、错误的数据)

解决方案:给写操作加锁

2) 不可重复读

场景:有三个事务 ABC

首先事务 A 执行一个修改操作,A 执行完毕的时候,提交数据

接下来事务 B 执行,读取到刚才 A 提交的数据

在 B 读取的过程中,又来了一个事务 C ,C 又对刚才 A 修改的数据再次做出了修改

此时对于 B 来说,后续再读取这个数据,读到的结果就和第一次读到的结果是不一样的

这个过程叫做“不可重复读”

tip:区分

当有多个事务,每个事务读取到的数据不一样,这种情况认为是正常的

当只有一个事务 B ,一个事务中,多次读取的结果不一样,是不正常的

解决方案:一个事务在读取数据的过程中,其他的事务不能修改它正在读的数据(给读操作加锁)

3) 幻读

场景:有一个事务 A 在读取数据

读的过程中,另一个事务 B 新增/删除了一些其他数据

此时站在 A 的角度上,多次读取的数据内容虽然一样,但是“结果集”不同

结果集不同,是否算是一个问题,视情况而定

解决方案:如多个客户端同时提交了多个事务,服务器一个一个的执行事务(执行完第一个事务,再执行第二个,再执行第三个...)

1.7 并发执行事务过程中涉及到三个问题 与 隔离性的关系

在 MySQL 中提供了 四个 隔离级别,可以通过配置文件来设置当前服务器的隔离级别

设置不同的隔离级别,就会使事务之间的并发执行的影响产生不同的差别,从而影响上述三个问题的情况

1) read uncommitted 读未提交

这种情况下,一个事务可以读取到另一个事务未提交的数据

此时就可能产生 脏读、不可重复读、幻读 三种问题

但是此时多个事务并发执行程度是最高的,执行速度也是最快的

2) read committed 读已提交

这种情况下,一个事务只能读取到另一个事务提交之后的数据(相当于给写操作加锁了)

此时可能会产生 不可重复读、幻读 两种问题(脏读问题解决)

此时,并发程度会降低,执行速度会变慢,同时也称其事务之间的隔离性提高了(事务之间的相互影响变小了,得到的数据更准了)

3) repeatable read 可重复读

这个情况下,相当于是给 写操作 和 读操作 都加锁了

此时可能会产生 幻读 问题(脏读 和 不可重复读 问题解决)

并发程度进一步降低,执行速度进一步变慢,事务之间的隔离性进一步提高

4) serializable 串行化

此时,所有的事务都是在服务器上一个接一个执行的

此时就解决了 脏读、不可重复读、幻读 三个问题

并发程度最低,执行速度最慢,隔离性最高,数据最准确

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值