Mysql事务相关面试汇总,你了解多少?(持续更新中...)

本文深入探讨了Mysql事务的四大特性——原子性、一致性、隔离性和持久性,并详细阐述了事务并发可能引发的脏读、不可重复读、幻读问题及其解决方案,介绍了Mysql的四种隔离级别。同时,文章还讨论了Mysql中的锁机制,如行锁、表锁及其粒度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是事务?

  简单来说就是:事务可以保证数据库额的完整性,保证执行的sql语句要不成功,要不失败,不存在中间状态(一半成功,一半失败)。事务是一系列的数据库操作,他们要符合 ACID 特性,事务是数据库应用的基本单位。MySQL 事务主要用于处理操作量大,复杂度高的数据。

2、事务特性是什么?

事务的4大特性:ACID;

  • A:原子性(Atomicity,或称不可分割性),一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
  • C:一致性 (Consistency),指的是数据库完整性约束没有被破坏,事务执行前后的状态都是合法的。即:系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态。
  • I:隔离性(Isolation,又称独立性),指的是数据库当有很多的事务同时进行修改某一行数据时,必然会产生并发操作等,隔离性就是这些事务,对表或行的操作都是透明的,之间互不干扰。
  • D: 持久性(Durability),指的是只要数据库的指令或事务执行成功,那么对数据的修改就是永久的,即便数据库服务出现故障等,数据也不会丢失。

3、事务并发可能带来哪些影响?什么是事务的隔离性?是如何解决的?

一般来说数据库并发事务会带来:脏读、不可重复读,幻读 等问题

  • 脏读:A事务读取到了B事务(更新操作)未提交的事务,因为B事务还未提交,可能存在回滚等操作,因此A事务读取到的数据就称之为脏数据了
  • 不可重复读:A 事务读取到了B事务(更新,删除操作)已经提交了的数据,导致了A事务前后读取的数据前后不一致的问题。
  • 幻读: A事务在进行范围查询时,查询到了B事务插入的数据。导致A事务前范围查询的时候查询数据量不一致的问题,类似于出现了幻觉一样,导致A事务前后范围查询数据量不一致

具体详细图移步: 终于搞懂Mysql事务及实现原理_化蝶飞舞的博客-优快云博客

 为了解决以上为问题,那么也就引入了事务的隔离性,若将事务之间的相互隔离,那么是不是就相互之间也就不受影响了呢,答案是显然的,Mysql等数据库引擎也是这么做的。当然每个引擎的功能不一样所采用的的隔离机制程度也就不一样了。如:Mysql中2个比较常用的引擎:InnoDB,MyIsam,Memory.

  • Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。
  • MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。
  • MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高

 Mysql以下4种隔离级别,分别解决了:脏读,不可重复读,幻读等问题

  • 未提交读(READ UNCOMMITTED):一个事务中修改的内容,即便该事务没有提交,对于其他事务也是可见得(即其他事务可以获取到该事务未提交的内容),所以可能会导致脏读,不可重复读,幻读等问题
  • 已提交读(READ COMMITTED) :一个暂未提交的事务中修改的数据内容,对于其他事务都是不可见得(即:其他事务不可以获取到该事务未提交的内容),所以可以解决脏读问题,但是仍然会发生不可重复读幻读等问题。
  • 可重复读(REPEATABLE READ):在一个事务中一个记录可以多次读取,且每次读取的内容前后是一致的。因此可以解决脏读,不可重复读问题,当仍然可能产生幻读, InnoDB默认隔离级别是RR, 因为InnoDB再通过锁(Next-key Lock)的算法,解决了这个幻读的问题
  • 可串行化(SERIALIZABLE):保证了并发情况下,和串行化的读取的结果是一致的,因此就解决了所有问题(包括:脏读,不可重复读,幻读).

4、你能说明下不可重复读和幻读的区别吗?

不可重复读:主要是对于数据的修改造成的

          例如: 事务A在查询某个字段的值时100,此事务B修改了下该字段+100并提交了,因此当前事务A中再次查询时,发现该值变为了:200。因此导致了事务A前后俩次查询的数据不一致了。

          幻读: 主要是对于一定范围内的数据新增或删除导致的(犹如看到了幻象一样)

         例如:   事务A在查询  age>10 and id < 20时,查询了5个数据,因此事务B在这个范围内插入了age=19的一行数据并提交,因此这时事务A再次查询时,查询处理6个数据了,因此就出现幻象一样,多了一条数据,我们叫这位幻读

5、有关于Mysql的锁,有哪些锁?锁的粒度等

InnoDB:  支持行锁,表锁

MyISAM: 支持表锁

按照锁的粒度:行锁  -> 表锁 -> 页锁

按照锁的使用:共享锁,排它锁,意向锁(表自身维护,提升加锁效率)

按照锁的算法:

      记录锁(record Lock)

      间隙锁(gap Lock) 锁住范围,id=(3,6],  事务A插入数据id =4,5 均不能获取锁

      范围锁  (next-key Lock)锁住范围的锁,左开右闭原则 如:id=(3,6],  事务A插入数据id =4,5,6 均不能获取锁     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值