后端面试重灾区:年轻人,谈谈什么是事务,什么是事务的四个特性(ACID),以及常见的事务隔离性?

什么是事务?

在计算机世界中,事务是由N步数据库操作序列组成的逻辑执行单元。

也可以说是一个程序执行单元。

这样说你可能不理解

但你只要理解下面支撑事务的四个特性,你也就理解了事务本身。

理解事务,以及理解支撑事务的四个特性 ACID

原子性(Atomicity) 一个事物是应用中不可再分的最小执行体,它们应该是一个整体,要么全部成功,要么全部失败。
一致性(consistency) 一个事务的执行是从一个一致性状态,变为另一个一致性状态。
隔离性(Isolation) 一个执行的事务,不能被其他事务所干扰
持久性(Durability) 事务一旦提交,对数据的任何改变应该是永久性的,即使其他操作或故障都不能进行干扰。

面试常问:事务隔离性

常见的隔离性

第一类丢失更新、第二类丢失更新。

脏读、不可重复读、幻读。

级别由低到高,Serializable 是最高级别,可以解决隔离的所有问题。(但是一般不建议,具体看下面详解)

Read Uncommitted 读取未提交的数据。
Read Committed 读取已提交的数据。
Repeatable Read 可重复读。
Serializable 串行化。

是不是对上面有很多种解决方式充满一个疑惑,用Serializable能解决所有问题,那么还需要这么多解决方法做什么呢?

因为解决不同的问题是分层级的,如果说用一种方式解决当然也是可以的,但是一旦某一种集成了能解决所有问题的方式,势必也是很臃肿的,因为没有针对性。

Serializable 虽然可以解决所有问题,但是需要对数据加锁,而学过我前面所写的多线程系列应该知道,加锁实际上会降低数据库性能。

在我们实际开发的时候,选择的隔离级别应该是既能满足我业务的需要,保证我业务的安全性,在这个前提下我们追求更高的性能。

刨析常见隔离性

特别提醒:

在看图时,可能很迷,其实按字面意思理解就好了,你要记住事务在这么短时间内是需要同步一致的。

1.第一类丢失更新

一个事务的 回滚,导致另外事务已更新数据丢失。

看图,当两个事务同时写数据或网络延迟,造成事务的回滚而导致事务数据的丢失。

所以如果你没有去做事务的隔离就会出现一个事务的回滚影响另一个事务的数据丢失。
在这里插入图片描述

2.第二类丢失更新

一个事务的 提交
导致另外一个事务已更新的数据丢失。

在这里插入图片描述

3.脏读

一个事务,
读取 另外一个事务 未提交 的数据。

可以看到事务A只是Write写,并没有Commit提交;而事务B直接读了事务A未提交的数据。

在这里插入图片描述

4.不可重复读

一个事务,
对同一个数据 前后读取 的结果不一致。

在这里插入图片描述

4.幻读

一个事务,
对同一个表前后查询的 行数 不一致。

在这里插入图片描述

最后

最后的最后,为了更好的阅读体验,我把想说的话都放在了下面,嘿嘿。

我是一颗剽悍的种子 把我会的,认真的分享 是我写博客一直不变的信条。
如果你能看到这篇博文,说明咱们还是很有缘的;希望能带给你一些许帮助,创作的不易,
把我文章的知识带走,你的三连留下,点赞,评论,关注,是我最大的动力。

猜你喜欢

转载自blog.csdn.net/A_hxy/article/details/108396344