ACID事务管理
对于面试官的回答,官方一些:
正式答案:
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
无奈的答案:
如果你真记不住的话,起码你要说一下事务的使用方法:
#开启
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)来实现的。
- 事务的一致性是通过原子性,持久性,隔离性来实现的。