ACID事务管理
对于面试官的回答,官方一些:
正式答案:
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
无奈的答案:
如果你真记不住的话,起码你要说一下事务的使用方法:
代码语言:javascript复制#开启
BEGIN TRANSACTION
#·
#·
#·
#···中间好多业务逻辑SQL
#成功提交
COMMIT
#失败回滚
ROLLBACK
事务通常是以BEGIN TRANSACTION 开始,以 COMMIT 或 ROLLBACK 结束。COMMIT 表示提交,即提交事务的所有操作。具体的说就是将事务中的所有对数据库的更新写回到磁盘上的物理数据库中,事务正常结束。ROLLBACK表示回滚,即在事务中运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库所有已完成的操作全部撤销,回滚到事务开始时的状态,这里的操作指对数据库的更新操作。
具体解读:
那么,后面咱们深入理解一下:
mysql数据更新的流程(问题的源头)
- 获取到原始数据,首先在执行引擎汇总查找数据,如果是在内存中则直接返回,否则从磁盘汇总load到内存,然后返回。
- 更新数据,从执行引擎获取到数据后对其进行修改,然后调用引擎接口把修改后的数据重新写入到引擎中。
- 重新写入数据,首先把上面的修改后的数据写入到内存,然后写入redo log中这里是二阶段中的一阶段prepare,操作完成后通知执行器完成。
- 写入bin log日志,这里还是二阶段中的一阶段的另一个分支写binlog日志。
- 提交事物,最后执行器调用引擎的提交事物接口,这里也就是二阶段中的二阶段,最后把redo log改为commit状态,最终完成。
ACID的实现原理
A(atomicity):使用undo log日志实现,原子性要么都成功,要么都失败,会记录每一次的操作记录的undo log日志,后面发生异常时在从undo log把事物回滚掉。
C(consistency):一致性是根据原子性 隔离性 持久性组合下完成的。
I(isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务所干扰,多个并发事务之间要相互隔离。【依赖于锁】
D(durability):redo log日志实现
实现原理小节:
- 事务的原子性是通过undolog来实现的。
- 事务的持久性性是通过redolog来实现的。
- 事务的隔离性是通过(读写锁 MVCC)来实现的。
- 事务的一致性是通过原子性,持久性,隔离性来实现的。
那么,问题又来了。其中undolog与redolog分别是做什么的?啥是MVCC?
undolog:解释在另外一篇文章,挺多的我就不罗列在这了。
undolog回滚日志(MySQL)_红目香薰的博客-CSDN博客
redolog:
https://blog.csdn.net/feng8403000/article/details/125025258
MVCC:
MySQL数据库的核心MVCC,这里有张图能看到整个的过程,方便理解,也包含了各种日志。
在MySQL数据库中有三个非常重要的日志binlog,undolog,redolog.
还差【binlog】没有说,先说完MVCC:
MVCC(Multi-Version Concurrency Control):多版本并发控制,是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 MVCC 在 MySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。
binlog:
Binlog日志是mysql的二进制日志重要日志,特别是项目中是必须要做好应用的;二进制日志,也就是我们常说的binlog。二进制日志记录了MySQL所有修改数据库的操作,然后以二进制的形式记录日志在日志文件中,其中还包括没调语句所执行的时间和消耗的资源,以及相关的事务信息。
1、主要作用:
- 以二进制形式记录更改数据库的SQL语句(insert,update,drop,alter等)。
- 用于MySQL主从复制。
- 增量数据备份及恢复。
2、配置方式
[mysqld] server-id = 1 # 后续讲主从的时候解释 log-bin = mysql-bin # binlog日志文件名 log-bin-index = binlog.index # binlog.index日志文件的索引文件 启用该选项数据库性能降低1%,但保障数据库完整性,对于重要数据库值得以性能换完整
最后的总结:
原子性:使用 undo log ,从而达到回滚 持久性:使用 redo log,从而达到故障后恢复 隔离性:使用锁以及MVCC,运用的优化思想有读写分离,读读并行,读写并行 一致性:通过回滚,以及恢复,和在并发环境下的隔离做到一致性。
好好看看,有很大帮助的,出现的概率较大的呢。