一、先了解事物
事物,程序能实现 事物的acid四个特性,说明程序是支持事物的。
1.A(Atomicity),原子性
原子性就是不可拆分的特性,要么全部成功然后提交(commit),要么全部失败然后回滚
(rollback)。若开启事务,在上述场景就不会出现 A 少 100 成功,B 多 100 失败 这种情况。
MySQL执行SQL语句时,会先写入redo log,再来执行SQL语句,当SQL语句执行错误时,会根据redo log来执行回滚操作。
2.C(Consistency),一致性
一致性是指 数据库将数据从一种状态 转变为 另一种状态时必须保持一致性。
MySQL是通过undo log来实现事物的一致性的。当执行SQL语句时,会先写入undo log,再写入redo log。
undo log是一种逻辑日志,会根据之前执行的SQL语句来写入对应的回滚undo log,比如执行 insert语句时,undo log就会记录一个delete语句,执行一个update语句时,就会记录一个相反的update语句来达到回滚的目的。当然,undo log也会产生 redo log日志,因为undo log也是需要进行持久性保护的。
3.I(Isolation),隔离性
隔离性,数据库事物的隔离级别产生三种现象,分别是 脏读、不可重复读和幻读。
脏读就是读取了别的事物未被提交的数据,别的事物后面又回滚了。导致读取时,读取了未提交的数据。即,读未提交。
不可重复读就是读取一条数据两次,第一次和第二次的结果不一致,也就是读取了别的事物已提交的数据。即,读已提交。
幻读就是 读取某一个范围的数据时,其他事物插入了这个范围内的某些数据,导致两次读取的数据也不一致。即,读其他数据。
串行化,解决了所有并发事物问题,但是性能太差,基本不用
导致这些现象的原因是因为MySQL数据库的InnoDB引擎是行锁,只能对某些行进行锁定,而无法锁定某个范围。
4.D(Durability),持久性
一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。
二、事物的经典场景
A给B转账100元,A账户减 -100,B账户增加 +100,两个状态必须一起转变,不能让A账户减了100,而B账户却没有增加。即这两个动作必须捆绑在一起,假如无法B账户无法增加100员,那就必须让A账户减少的100元这个动作也回滚回去。
三、事物的实现原理和琐
1.事物的问题场景
多对一问题,多个操作同时操作一个资源,而状态的变化是非原子性的,有中间状态,会导致哄抢资源的混乱状态。
一对多问题,一个操作需要绑定一系列的资源操作,若任何一个操作失败了,都会导致整个操作都毫无意义。
2.事物的实现原理
redo log,也叫重做日志,是用来实现事物的持久性的。
undo log,也叫回滚日志,用来记录数据被修改前的信息。
当执行SQL发生错误时,会根据数据之前的信息做回滚操作。
3.MySQL琐技术
在MySQL中,读读可以并行,而写读,读写、写写是不能并行的。
4.MVCC多版本并发控制
在InnoDB引擎中,每行记录后面都保存了两个隐藏的列,一个列保存行的创建时间,一个列保存了行的过期时间,存储的并不是系统时间,而是版本号。
MySQL中
事物的原子性是通过undo log来实现的
事物的持久性是通过redo log来实现的
事物的隔离性是通过 琐 + MVCC来实现的
而事物的一致性 是通过原子性、持久性、隔离性来实现的。做到了原子性、持久性、隔离性也就实现了事物的一致性。