张哥是某传统通讯公司的程序员,去年由于疫情的影响公司效益不好,收入降了一大截,房贷、车贷和孩子的奶粉钱压得他喘不过气来,这不到了金三银四的季节,张哥萌生了想要跳槽的想法,投了很多的企业,收到的面试机会也不少,但是每次聊完技术,面试官都是很客气的告诉张哥:今天的面试就到这里结果HR会通知你的。

张哥很是苦恼,与我聊天的时候:说自己这些年光CRUD了,根本没有学习过其他的知识。他还告诉我一个消息:最近的面试,面试官死抓着数据库不放。这不昨天,面试官让张哥举例说下数据库的事务隔离级别的作用,他没答上来,所以又凉了。

正好自己最近也在备战,分享一下自己对数据库事务隔离级别的理解

什么是事务

数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

通俗点来讲:就是我们执行的一系列SQL语句,如果在同一个事物中,要么全部执行成功,要么全部执行失败,不会存在部分执行成功,部分执行失败并且数据保存到磁盘上之后,就不会再丢失了

数据库事务的特性

数据库的事务

1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。

2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。

3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。

4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(1)

四大事务隔离级别

在讲事务隔离级别前:我想先讲一下事务并发带来的问题

  1. 脏读 数据库有两个事务A、B,脏读是指事物A读取到事物B未提交事物的数据,当事物B回滚后,事物A拿到的数据就是脏数据。
  2. 不可重复读 数据库有两个事务A、B,不可重复读是指事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致
  3. 幻读 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

事务隔离级别

脏读

不可重复读

幻读

读取-未提交(read-uncommitted)

读取-已提交(read-committed)

可重复读(repeatable-read)

串行化(serializable)

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

示例带你了解隔离级别的作用

开启事务的语句:start transaction;

首先我们先打开两个MySQL的客户端并查看其事务隔离级别,如下图:

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(2)

默认的事物隔离级别

1、验证脏读

先设置两个事物的隔离级别为 read-uncommitted;

set session transaction isolation level read uncommitted;

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(3)

设置读未提交事物隔离级别

事物A:将数据修改为1000

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(4)

事务A修改值

事物B:将数据改为800,但是事务B没有提交

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(5)

事务B修改数据

此时事务A读取到了事务B修改后的值

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(6)

事务A读取最新的数据

此时如果事务B回滚了,事务A读取到的就是脏数据。

2、验证不可重复读

先设置事务隔离级别为read committed;

set session transaction isolation level read committed;

事务B:第一次修改数据,未提交事务

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(7)

事务A:第一次读取数据,未读取到事务B修改的数据,解决了脏读问题

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(8)

事务B:提交事务

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(9)

事务A:第二次读取数据,读取到了事务B提交数据

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(10)

事务B:重新开启事务,第二次修改数据,并提交数据

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(11)

事务A:再次读取数据,发现同一个事物内,两次读取的数据是不一样的,这就是不可重复读

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(12)

3、验证幻读

开启两个事物,将事物的隔离级别设置为:repeatable-read(mysql默认的隔离级别)

事物A:第一次读取的数据

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(13)

事物B:第一次修改数据

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(14)

事物A:第二次读取数据

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(15)

事物B:第二次修改数据

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(16)

事物A:第三次读取数据,

数据库事务的隔离级别是什么(举例讲讲数据库的事务隔离级别)(17)

因此我们可以看到解决了不可重复度的问题

总结

数据库的事务隔离级别分为四种,不同的隔离级别可以解决不同的事务并发问题,同时更高的隔离级别会损失更多的性能,因此我们在实际使用的时候,要根据自身的业务场景来选择合适的隔离级别。

[机智]希望大家新的一年都能涨薪,实现人生理想。[机智]

,