- 😜作 者:是江迪呀
- ✒️本文关键词:
MySQL
、事务
- ☀️每日 一言:
凡事看开一些,一切都会好起来的~
一、什么是事务
事务就是指一组操作的集合,要么全部成功,要么全部失败这就是事务。事务是在引擎层进行实现的,也就是说并不是所有的引擎都可以支持事务,MyISAM引
擎就不支持事务,InnoDB
支持事务的。InnoDB
是MySql
默认的引擎。
二、事务可以用来做什么
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 locks 或 next-key locks 解决幻读。
4.4 串行化(Serializable
)
强制事务排序,使多个事务之间不发生冲突,排着队一个个的执行。此隔离级别可以解决幻读的问题,实现的原理是在每个读的数据行上加锁,由于事务的串行化会导致大量的超时和锁竞争,效率很低。
5.事务并发出现的问题
5.1 脏读:
一个事务读取到另一个未提交的数据。原因是在一个事务读取数据的前后另一个事务对该数据做了修改。
5.2 不可重复读:
在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。重点是读取的数据内容不一致。
5.3 幻读:
在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。重点是读取的数据的条数不一致。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读 | × | × | √ |
串行化 | × | × | × |