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

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

文章标题

一: 使用场景

二: 定义

三: 举例说明

四: 总结


  温馨提示: 本文总共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

四: 总结

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


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


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
6月前
|
SQL 存储 关系型数据库
美团面试:事务提交了,数据丢失 了 ?大概的原因是什么?
美团面试:事务提交了,数据丢失 了 ?大概的原因是什么?
美团面试:事务提交了,数据丢失 了 ?大概的原因是什么?
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
11月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
Java 程序员 Spring
Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
Spring事务的1道面试题
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
前端开发 Java 数据库连接
一天十道Java面试题----第五天(spring的事务传播机制------>mybatis的优缺点)
这篇文章总结了Java面试中的十个问题,包括Spring事务传播机制、Spring事务失效条件、Bean自动装配方式、Spring、Spring MVC和Spring Boot的区别、Spring MVC的工作流程和主要组件、Spring Boot的自动配置原理和Starter概念、嵌入式服务器的使用原因,以及MyBatis的优缺点。
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
12月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
12月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!