MySQL的事务隔离级别

  • 😜           是江迪呀
  • ✒️本文关键词MySQL事务
  • ☀️每日   一言凡事看开一些,一切都会好起来的~

在这里插入图片描述

一、什么是事务

事务就是指一组操作的集合,要么全部成功,要么全部失败这就是事务。事务是在引擎层进行实现的,也就是说并不是所有的引擎都可以支持事务,MyISAM引擎就不支持事务,InnoDB支持事务的。InnoDBMySql默认的引擎。

二、事务可以用来做什么

2.1保证数据的一致性:

事务可以确保数据库中的数据保持一致。例如,如果你需要在多个表中插入、更新或删除数据,事务可以确保这些操作要么全部成功,要么全部失败,从而避免了部分操作成功、部分操作失败的情况。

2.2 处理复杂业务逻辑:

在某些情况下,一个完整的业务操作可能需要多个SQL操作,事务可以将这些操作组合在一起,以确保业务操作的原子性。如果任何一个操作失败,整个事务会被回滚,不会影响数据的完整性。

2.3 并发控制:

在多用户并发访问数据库的情况下,事务可以用来协调多个用户对相同数据的访问,以避免数据的脏读、不可重复读和幻读等问题。通过使用锁和事务隔离级别,可以控制并发访问的方式。

2.4 错误处理:

如果数据库操作中出现错误,事务可以提供一种机制来回滚之前的操作,以确保数据的完整性。这对于在关键数据上执行操作时尤为重要。

2.5 批量处理:

事务还可以用于处理批量数据操作。例如,在批量导入数据或删除大量数据时,事务可以确保操作的一致性和可回滚性。

2.6 分布式系统:

在分布式数据库系统中,事务用于确保分布在不同节点上的操作的一致性。分布式事务协议可以确保多个数据库节点上的操作要么全部成功,要么全部失败。

2.7实现业务规则:

事务可以用于实现业务规则的强制执行。例如,确保账户余额不会变为负数,或者确保订单状态符合业务逻辑。

比如在删除父级数据时连带着子级数据也会被删除,当这期间出现错误时,数据会被全部还原回滚到删除前,来保证数据的完整性可靠性

三、事务的四大特性

3.1 原子性

事务最基本的操作单元,要么全部成功,要么全部失败,不会结束在某个中间环节,事务在执行过程中发生错误,会回滚到事务开始的状态,就像这个这个事务从来没有执行过一样。

3.2 一致性

指的是在一个事务执行之前和执行之后, 数据库必须处在一致性状态,如果事务成功的执行,那么系统中所有变化将正确的应用,系统处于有效状态。

3.3 隔离性

指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间,由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是修改之后的状态,事务不会查看到中间状态的数据。

3.4 持久性

指的是只要事务成功结束,它对数据库所做的更新就必须永久的保存下来,数据成功落盘。即使发生系统崩溃,重新启动数据库后,数据库还能恢复到事务成功结束的状态。

四、事务的隔离级别

MySql的事务隔离级别一共分为4种,用来限定事务内外的哪些改变是可见的,哪些是不可见的。事务隔离级别越低,支持并发的性能越高,系统的开销越小!

4.1 读未提交(Read Uncommitted

一个事务还未提交(commit)变更就被其它事务读取到了。这个隔离级别是很少在实际应用中看到的,因为他造成的事情很多,比如脏读脏读就是一个事务读取到了其它事务还未提交的内容。而且这种隔离级别的性能也不比另外三种好多少,所以它是最少被实际应用的。

4.2 读已提交(Read committed

一个事务只能看到其它事务已经提交(commited)的内容。因为它满足隔离的简单定义,所以这是大多数数据库所采用的的隔离级别,但是并不是MySql所默认的。这种隔离级别会造成不可重复读不可重复读就是同一条SQL不能重复执行,因为两次查询出来的内容可能不一致。原因同一事务的其他实例在该实例处理其间可能会有新的commit(修改了内容),导致查询的内容不一致。

4.3 可重复读(Repeatable Read

同一条SQL查询多次,会看到同样的数据行。这是MySql默认的隔离级别。但是这种隔离级别也会出现一些问题,比如幻读,幻读就是当用户读取某一范围内的数据时,另一个事务又在该范围内插入了新的数据,当用户再次读取该范围内的数据时就会出现“幻影”行(行数不一致)。幻读不可重复读有些类似,都是表现出两次读取的内容不一致的状况,但是二者还是有差别的,幻读侧重的是删除新增不可重复读侧重的是修改,解决幻读的方法是锁住满足条件的行,而解决不可重复读的方法是锁住表。幻读在InnoDB和FaIcon存储引擎通过多版本控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

对于快照读,InnoDB 使用 MVCC 解决幻读,对于当前读,InnoDB 通过 gap locksnext-key locks 解决幻读。

4.4 串行化(Serializable

强制事务排序,使多个事务之间不发生冲突,排着队一个个的执行。此隔离级别可以解决幻读的问题,实现的原理是在每个读的数据行上加锁,由于事务的串行化会导致大量的超时和锁竞争,效率很低。

5.事务并发出现的问题

5.1 脏读:

一个事务读取到另一个未提交的数据。原因是在一个事务读取数据的前后另一个事务对该数据做了修改。

5.2 不可重复读:

在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。重点是读取的数据内容不一致。

5.3 幻读:

在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。重点是读取的数据的条数不一致。

隔离级别脏读不可重复读幻读
读未提交
读已提交×
可重复读××
串行化×××
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是江迪呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值