MySQL中的事物

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: MySQL中的事物

一、背景

10年前,银行转账的时候还会有一些bug,比如,你转账给某人,你钱已经转出去了,但是那个人却没收到钱,你的钱却是真的减少了,那么对于这种情况我们应对的方案是什么呢?

因此,我们不想让这两个操作单独执行,我们想把转账出去操作和收钱操作合并到一起,再一起执行这两操作,当前面转账出去后,收账的操作出现问题了,我们就要进行回滚操作,把转账那一操作回滚到还没转账时的情况。

因此,大佬们引出了事物这个概念,用事物把多个操作打包在一起。


二、事物的概念

概念:

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。

在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

回滚:

当事物中某一个操作失败后,数据库是咋知道之前的数据呢?数据库是没有" Ctrl + Z "的。

数据库对于事物来说,使用特殊的机制undo log + redo log这两个是通过日志,println写到文件记录之前的数据的操作。

当数据库中间挂了,但是日志已经记录下来了,等到数据库重启之后,读取之前的日志,看看是否有这种执行一半的事物,如果有就会进行回滚操作,回到执行这个事物之前的操作。

优缺点:事物虽然让数据更靠谱了,但是执行效率也变低了。


三、事物的特性

1、原子性

通过事物,把多个操作打包到一起。(初心)

2、一致性

相当于原子性的延伸,当数据库中间出现问题,如“钱凭空消失”这种情况不会发生

另一方面,还可以通过约束,避免数据出现一些非法的情况

3、持久性

事物任何的修改,都是持久化存在的(写入硬盘的),无论是重启程序,还是重启主机,修改都不会丢失(数据库本身就是为了持久化存储)

4、隔离性

多个事物并发执行的时候,可能会带来一些问题,可以用过隔离性来对这里的问题进行权衡,看你是希望数据更准确,还是速度更快。


四、并发执行的三个典型bug

1、脏读

概念:有两个事物,事物1和事物2,事物1修改了某个数据,但是数据还没“提交”(“提交”的意思就是告诉服务器完毕,over的意思),事物2读取了同一个数据,事物2读的数据,可能就是脏的数据,因为事物1还没修改完,事物2就读了。

解决方案:给写加锁,即写的时候不能读,写完才能读。

2、不可重复读

概念:有两个事物,事物1修改数据,事物2读取数据(可能会多次读取数据),基于脏读,给写加锁后,事物2项读数据,只能等事物1修改完后才能读,但是这时有个事物3,也是修改同一个数据,那么修改了后,事物2在读的过程中,在执行事物3之前和之后,读取的两个数据不同。(如果读不同事物得到的数据不同,是符合逻辑的,但同一数据读到的结果不同,那就难受了)

解决方案:给读加锁,即读的时候不能改,降低并发程度,数据的准确性也就提高了

3、幻读

概念:基于脏读和不可重复读,给写加锁,也给读加锁了,现有2个事物(多次执行),事物1修改数据,修改完后,事物2读取同一个数据,但此时有个事物3,他不去修改前面的同一个数据,但是在同一张表里,他新增了一个数据,这就会导致新增前事物2读取的“结果集”和新增事物2后读取的“结果集不同”(结果集:查询的时候,有多少行)。

解决方案:串行化,不在进行任何并发了,每个事物都是串行执行(执行完第一个,再执行第二个,再执行第三个)。


五、MySQL的隔离级别

1、read uncommitted 读未提交

并行程度最高,隔离程度最低,效率最高,数据是最不靠谱的

可能会出现:脏读+不可重复读+幻读

2、read committed 读已提交

相当于给写操作加锁,并行程度降低了,隔离程度提高了,效率降低了,数据靠谱一些

可能会出现:不可重复读+幻读

3、repeatable read 可重复读

相当于给读操作和写操作都加锁了,并行程度降低了,隔离程度提高了,效率降低了,数据又更靠谱了。

可能会出现:幻读。

4、serializable 串行化

让所有事物都串行执行,并行程度最低,隔离程度最高,效率最低,数据最靠谱


都看到这了,点个赞再走吧

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
SQL 存储 关系型数据库
MySQL的事务(看看也许有帮助呢)
【5月更文挑战第18天】MySQL的事务
45 3
|
SQL 关系型数据库 MySQL
【MySQL进阶-04】深入理解mysql事务本质(超级详解)
【MySQL进阶-04】深入理解mysql事务本质(超级详解)
126 1
|
11月前
|
SQL 关系型数据库 MySQL
|
存储 SQL 关系型数据库
【MySQL】一文搞懂 MySQL 中的事务
0. 前提概要 谈事务,一般就是说数据库事务。本篇文章以 MySQL 为例谈一谈事务。 MySQL 的 Indndb 引擎和 bdb 引擎支持事务。MySQL 的myisam ,memory 等存储引擎是不支持事务的。
|
SQL 存储 缓存
MySQL:索引与事物
MySQL:索引与事物
135 0
MySQL:索引与事物
|
存储 SQL 算法
【MySQL技术内幕】7.6-事物的隔离级别
【MySQL技术内幕】7.6-事物的隔离级别
106 0
|
SQL 安全 关系型数据库
MySQL 04 基础之事务
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
|
SQL 缓存 关系型数据库
MySQL复习资料(八)——MySQL-事务
MySQL复习资料(八)——MySQL-事务
176 0
MySQL复习资料(八)——MySQL-事务
|
存储 SQL 关系型数据库
MySQL进阶:MySQL事务(理论一)
MySQL 事务主要用于处理操作量大,复杂度高的数据。比方我想要删除一个用户(销户)以及这个用户的个人信息、订单信息以及其他信息,这里会涉及到很多SQL语句的执行来满足我们的业务需求,我们要一次性删除这些数据,这些数据库操作语句就构成了一个事务。 那么在MySQL数据库中,我们如何查看存储引擎是否支持事务呢?下面我就从我实验机器上的MySQL来一探究竟。
MySQL进阶:MySQL事务(理论一)
|
存储 缓存 关系型数据库
【MySQL】事物认识
【MySQL】事物认识
138 0
【MySQL】事物认识
下一篇
无影云桌面