写点什么

MySQL 基础之十四:事务

用户头像
打工人!
关注
发布于: 2021 年 06 月 16 日
MySQL基础之十四:事务

主要内容:

本文的主要讲解什么是事务、事务的特性等知识——比较重要

事务(transaction):

transaction 中文意思就是交易,可能是国人翻译的时候可能是追求高大上,就索性把它叫做事务。事务是一个完整的业务逻辑单元,不可再分。说人话就是:在一个两个账户进行转账的业务中,A 账户转给 B 用户 100 元,那么 B 用户就要多 100 元,这整个过程就是一个完整的业务逻辑单元,这个操作不能分裂开来,A 少钱和 B 多钱必须同时成功,不允许出现一个成功,一个失败这种情况发生。现在应该理解这个事务是咋回事了吧。

和事务有关的操作:

和事务有关的操作只有 DML 语句——insert、delete、update

这是为什么呢?以上三种操作是和数据库中的表的数据(记录)有关的,事务的存在就是为了保证数据的完整性和安全性。

小贴士:假设一个业务逻辑单元只需要 1 条 DML 语句就可以搞定,这个时候就不需要事务来保证数据的完整性了。但实际上,一个业务逻辑是需要多条 DML 语句共同完成——比如转账业务逻辑。

事务的特性:

事务包含四大特性——简称为 ACID

  • 原子性(atomic)——A:事务是最小的工作单元,不可分割。

  • 一致性(consistency)——C:事务必须多条 DML 语句同时成功,或者同时失败。

  • 隔离性(Isolation)——I:事务 1 和事务 2 之间互相隔离,不会互相影响。

  • 持久性(durability)——D:最终的数据必须持久化到硬盘里,事务才算成功的结束。

事务之间的隔离性:

事务的隔离性存在隔离级别,SQL 标准下,隔离级别包括 4 个:

  • 第一级别:读未提交(read uncommitted)

对方事务还没有提交,我们的当前事务可以读取到对方未提交的数据。这种现象也称为脏读(dirty read)

  • 第二级别:读已提交(read committed)

对方事务提交之后的数据我方可以读取到,解决了脏读问题。但是读已提交存在一个问题:不可重复读。

  • 第三级别:可重复读(repeatable read)

想了解可重复读,要先了解不可重复读问题:就是我第一次,是 a,当我再次读的时候,又成可 b,不敢不能重复读取啊,一重复读取,查询结果就会变,到底用哪个是个事啊。

因此可重复读解决了不可重复读的问题,但是还存在读取幻象的问题。

  • 第四级别:序列化,串行化(serializable)

先了解一下幻象是什么?:我第一次读,查询结果是一条数据,当我用同样的查询语句再次读取时,变成了 2 个甚至更多的数据,难道我出现幻觉了吗,这就是幻象。

串行化解决了所有的问题,但是效率低,事务需要排队。


发布于: 2021 年 06 月 16 日阅读数: 8
用户头像

打工人!

关注

打工人! 2019.11.10 加入

InfoQ年度最佳内容获得者。 InfoQ签约作者 本人打工人一枚,自动化和控制专业入坑人一枚。目前在研究深度强化学习(DRL)技术。准备入坑互联网小白一枚。喜欢了解科技前沿技术,喜欢拍照。

评论

发布
暂无评论
MySQL基础之十四:事务