你真的懂事务的隔离级别?(面试必问知识)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 你真的懂事务的隔离级别?(面试必问知识)

文章标题

一: 使用场景

二: 定义

三: 举例说明

四: 总结


  温馨提示: 本文总共4530字,阅读完大概需要5-7分钟,希望您能耐心看完,倘若你对该知识点已经比较熟悉,你可以直接通过目录跳转到你感兴趣的地方,希望阅读本文能够对您有所帮助,如果阅读过程中有什么好的建议、看法,欢迎在文章下方留言或者私信我,您的意见对我非常宝贵,再次感谢你阅读本文。

image.png

一: 使用场景

image.png

image.png

二: 定义

image.png

(一) 在平常的工作中有使用过事务?


      1、定义: 事务既多个对数据库操作的集合,这些操作要么一起成功,要么一起失败。


      2、使用场景: 当对存在多个对数据库的操作的时候,这些操作要么一起成功,要么一起失败时就可以使用到事务。如: 创建一个订单的时候,需要减去库存,那么这两个对数据库的操作必须同时成功或者失败,不然就会出现订单创建失败但是却减去了库存,或者创建订单成功却没有减去库存的问题。


(二) 事务有什么特性,具体的含义是什么?


     答:事务的基本特性有: ACID,具体含义如下:


原子性(Atomicity): 表示事务是一个不可分割的工作单位,事务中的操作要么全部成功、要么全部失败。如: 创建订单、扣减库存是同时成功或者同时失败

一致性(Consistency): 表示事务操作前后的数据完整性要保持一致。如: A账户有30块,转了10块给B账户,事务前后总的金额还是30块,不会随着A转移到B账户就导致数据完整性不一样了

隔离性(Isolation): 并发情况下操作数据库时,多个事务之间是相互隔离的,操作是互相不影响的,可以通过设置隔离级别来控制,具体下面会举例说明。如: A事务修改了C记录的年龄,B事务同时读取C记录的年龄,这时候B事务读取到的年龄还是A事务修改之前的,因为A事务没有提交(这个案例是以:Mysql数据库进行举例,默认的隔离界别是可重复读)

持久性(Durability): 事务对数据库的数据影响是永久的,只要提交了事务,那么数据库的数据就被更改了,即使数据库出现故障,也不会对这个数据造成影响。如:A事务修改了张三的年龄为1000岁,并提交了,那么即使这个数据是不对的,但是张三的年龄也只能是一千岁了(笑…)

注意: 事务在提交之前是可撤回的如:张三开启事务后准备给李四转1万块钱,但是在提交之前他又回滚了,直接调用事务的撤回(rollback),那么李四账户里面是不会收到张三转过来的钱的。

(三) 事务的隔离级别会导致什么问题,能够举例说明?


一: 事务的隔离级别分为:


1、读未提交(Read Uncommitted): 会导致脏读、不可重读读、幻读问题。

2、读已提交(Read Committed): 会导致不可重读读、幻读问题(PostgreSQL数据库默认的隔离级别)。

3、可重复度(Repeatable Read): 会导致幻读问题(Mysql数据库默认的数据库隔离级别)。

4、串行化(Serialized):不存在任何问题,但是这个效率非常低,同一时刻只能有一个用户可以操作数据库,只有这个用户操作完了,其他的用户才能进行操作。


二 不同的事务隔离级别会导致的问题:


1、脏读: 一个事务读取到另一个事务未提交的数据。如: 张三说还李四一万块,开启事务之后就将钱转给李四,然后打电话叫李四看钱到没,李四查看说到了,然后张三直接回滚事务(rollback),既事务内所有的操作都放弃,张三自己账户的钱没扣,却说已经还给李四了,李四再查看,发现自己的账户没有转入的钱,只能当冤大头了(笑)


2、不可重读读: 在同一个事务下,多次读取同一个记录但返回的数据不一样(这个是针对:更新操作)。如: A,B两个事务同时访问数据库,B事务查询数据库发现A账户还有一万块钱,此时A事务购买了东西,账户被扣了五千元,B忘记了账户还有多少钱,再查看,发现卡上只有五千元了,这种情况就是不可重复读


3、幻读: 在同一个事务中,多次读取的数据数目前后不一致(这个主要是针对: 添加和删除操作)。如: A,B两个事务同时操作数据库中,A查询表发现还有10个记录,此时,B事务删除了两条,并提交了事务,A事务再查看发现少了两条记录,就感觉自己出现了幻觉一样,这个就是幻读。

image.png

三: 举例说明

(一): 注意事项(以Mysql数据库为例,开启两个控制台进行测试)


  1、查询Mysql默认的数据库隔离级别:

(1)、mysql5.7以后: show variables like 'transaction_isolation';或者select @@transaction_isolation;
(2)、mysql5.7以前: show variables like 'tx_isolation';或者select @@tx_isolation;

image.png

 2、修改数据库隔离级别(修改后需要退出重新登录才生效):

set global tx_isolation='read-uncommitted(填写隔离级别)';  

image.png

 3、脏读现象测试:


  (1): 设置隔离级别为Read-Uncommitted

image.png

(2): 测试数据

image.png

4、不可以重复读现象测试:

  (1): 设置隔离级别为Read-Committed

image.png

(2): 测试数据

image.png

4、幻读现象测试:

  (1): 设置隔离级别为Repeatable-Read

image.png

(2): 测试数据

image.png

5、延伸知识:

image.png

image.png

四: 总结

     从上面实际的案例中我们发现,在并发情况下数据库会因为不同的隔离级别而出现不同的问题,所以我们要根据实际情况去设置数据库的隔离级别(但是一般是使用数据库默认的,除非有特殊要求),千里之行始于足下,希望大家看完文章可以手动实践一下,这样可能印象会更加深刻。


     非常感谢你的阅读! 码字不易,如果你觉的文章对你有帮助的话,请给我点个赞和关注,后面还会书写更多的文章跟大家分享其他的知识。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
1月前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
1月前
|
前端开发 Java 数据库连接
一天十道Java面试题----第五天(spring的事务传播机制------>mybatis的优缺点)
这篇文章总结了Java面试中的十个问题,包括Spring事务传播机制、Spring事务失效条件、Bean自动装配方式、Spring、Spring MVC和Spring Boot的区别、Spring MVC的工作流程和主要组件、Spring Boot的自动配置原理和Starter概念、嵌入式服务器的使用原因,以及MyBatis的优缺点。
|
1月前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
1月前
|
数据库 微服务 中间件
XA事务 面试准备
【8月更文挑战第7天】
43 7
|
1月前
|
算法 Go 数据库
[go 面试] 并发与数据一致性:事务的保障
[go 面试] 并发与数据一致性:事务的保障
|
2月前
|
XML Java 关系型数据库
面试一口气说出Spring的声明式事务@Transactional注解的6种失效场景
面试一口气说出Spring的声明式事务@Transactional注解的6种失效场景
|
25天前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
25天前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
25天前
|
Java
【Java基础面试三十七】、说一说Java的异常机制
这篇文章介绍了Java异常机制的三个主要方面:异常处理(使用try、catch、finally语句)、抛出异常(使用throw和throws关键字)、以及异常跟踪栈(异常传播和程序终止时的栈信息输出)。