事务
1 什么是数据库事务?
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
事务最经典也经常被拿出来说例子就是转账了。
假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明
的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。
所以事务就是保证这两个关键操作要么都成功,要么都要失败。
2 事物的四大特性(ACID)介绍一下? 以及对应的实现原理说下
四大特性也就是原子性,一致性,隔离性,持久性
首先我们看原子性:说白了就是当前事务的操作要么同时成功,要么同时失败,而原子性其实是由undo log日志来保证的
(这里简单介绍下undo log,undo log他其实是一种用于撤销回退的日志,也就是说在事务没提交之前 mysql会先记录更新前的数据到undo log日志文件中,当事务回滚时,可以用undo log来进行数据回滚,其实说白了undolog就是用执行的反向sql语句来进行回滚)
接着看隔离性:隔离性其实就是事务在并发执行过程中,不能互相干扰,而隔离性其实是由mysql中的各种锁以及mvcc机制实现的
(之后会具体介绍mvcc等机制)
再看持久性:持久性简单的理解就是一旦你提交了事务,那么它对于数据库的改变就是持久的,而持久性其实是由redo log日志来保证的
(这里也简单的说下redo log日志,首先 我们要知道当我们修改某条记录的时候其实并不是立刻刷入到磁盘的,而是会写buffer pool并将buffer pool标记为脏页,与此同时将本次对页的修改以redo log的形式记录下来,而后续innodb会在合适的时候通过后台线程将缓存再buffer pool中的脏页刷入到磁盘,这其实就是WAL技术
说白了WAL 就是mysql的写操作并不是立刻写到磁盘,而是先写文件,然后再合适的时间在写磁盘,
而正是因为有redo log的存在,即便系统崩溃了,还没来得及持久化脏页数据,mysql在重启后,会根据redo log的内容,将所有数据恢复到最新的状态。)
一致性:使用事务的最终目的,而一致性其实是由原子性,隔离性,持久性,这三个特性,以及业务代码正确逻辑来保证的