您现在的位置是:首页 >其他 >【事务】怎么去理解事务?网站首页其他
【事务】怎么去理解事务?
1、什么是事务?
事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单元。
2、事务具有哪些特性?
一个逻辑工作单元要成为事务,在关系型数据库管理系统中,必须满足 4 个特性,即所谓的 ACID:原子性、一致性、隔离性和持久性。
- 一致性:事务开始之前和事务结束之后,数据库的完整性限制未被破坏。
- 原子性:事务的所有操作,要么全部完成,要么全部不完成,不会结束在某个中间环节。
- 持久性:事务完成之后,事务所做的修改进行持久化保存,不会丢失。
- 隔离性:当多个事务并发访问数据库中的同一数据时,所表现出来的相互关系。
在4 个特性中有 3 个与 WAL( WAL全称为Write-Ahead Logging,预写日志系统) 有关系,都需要通过 Redo、Undo 日志来保证等。
下面来说这几个特性:
一致性
首先来看一致性,一致性其实包括两部分内容,分别是约束一致性和数据一致性。
约束一致性:大家应该很容易想到数据库中创建表结构时所指定的外键、Check、唯一索引等约束。可惜在 MySQL 中,是不支持 Check 的,只支持另外两种,所以约束一致性就非常容易理解了。
数据一致性:是一个综合性的规定,或者说是一个把握全局的规定**。因为它是由原子性、持久性、隔离性共同保证的结果,而不是单单依赖于某一种技术。**
原子性
接下来看原子性,原子性就是前面提到的两个“要么”,即要么改了,要么没改。也就是说用户感受不到一个正在改的状态。MySQL 是通过 WAL(Write Ahead Log)技术来实现这种效果的。
可能你想问,原子性和 WAL 到底有什么关系呢?
其实关系非常大。举例来讲,如果事务提交了,那改了的数据就生效了,如果此时 Buffer Pool 的脏页没有刷盘,如何来保证改了的数据生效呢?就需要使用 Redo 日志恢复出来的数据。而如果事务没有提交,且 Buffer Pool 的脏页被刷盘了,那这个本不应该存在的数据如何消失呢?就需要通过 Undo 来实现了,Undo 又是通过 Redo 来保证的,所以最终原子性的保证还是靠 Redo 的 WAL 机制实现的。
持久性
再来看持久性。所谓持久性,就是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的操作或故障不应该对其有任何影响。前面已经讲到,事务的原子性可以保证一个事务要么全执行,要么全不执行的特性,这可以从逻辑上保证用户看不到中间的状态。
但持久性是如何保证的呢?一旦事务提交,通过原子性,即便是遇到宕机,也可以从逻辑上将数据找回来后再次写入物理存储空间,这样就从逻辑和物理两个方面保证了数据不会丢失,即保证了数据库的持久性。
隔离性
所谓隔离性,指的是一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对其他的并发事务是隔离的。锁和多版本控制就符合隔离性。