目录
说明
前言
事务
ACID:
并发事务的问题:
解决方案:
uddo log 和redo log的区别:
先了解数据库的页概念:
redo log:
undo log:
区别:
mvcc:
说明
本文适合刚刚学习Java的初学者,也可以当成阿岩~的随手笔记.接下来就请道友们和我一起来学习吧!
如果本文有写的不对的地方,请道友们一定要说出来,避免影响到刚刚学习Java的道友们,也让阿岩~进行更新于改进,在这里谢谢各位道友了!
前言
在使用Mysql的时候总会听到事务,但是不知道事务是什么,或者事务是干什么的?
事务
事务(ACID)是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销的请求,即这些操作同时成功,要么同时失败.
ACID:
原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败.
一致性(Consistency):事务完成时,必须使所有的数据都保存一致状态
隔离性(Isolation):数据库系统提供的隔离机制,保障事务在不受外部并发操作影响的独立环境下运行
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据改变就是永久的
(可根据转账案例来说:A向B转账:原子性来保证一起成功或全部失败. 一致性,当A-1000后B必须增加1000. 隔离性来保证当前转账不会受到外部环境影响. 持久性,当转账成功后是永久的)
并发事务的问题:
脏读: 一个事务读到另外一个事务还没有提交的数据
不可重复读: 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
幻读: 事务A查询数据时发现没有,就去插入数据,但B事务已经插入数据.事务A去插入数据时发现已经有了,事务A就去读取数据,但因为已经解决了事务不可重复读的问题,就导致事务A一直查到数据为空
解决方案:
对事物进行隔离
uddo log 和redo log的区别:
先了解数据库的页概念:
缓冲池(buffer pool): 主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查时,先操作缓冲池中的数据(若缓存池中没有数据,则从磁盘加载并缓存),以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度
数据页(pege):是innoDB储存引擎磁盘管理的最小单元,每个页的大小默认为16KB.页中储存的是行数据
redo log:
重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性.
该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中.当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误是,进行数据恢复使用
undo log:
回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚和MVCC(多版本并发控制).undo log和redo log记录物理日志不一样,它是逻辑日志
-
可以任务当删除一条记录时,undo log中会记录一条对应的insert 记录,反之依然
-
当修改一条记录时,它记录一条向反的修改记录.当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚.
undo log可以实现事务的一致性和原执行
区别:
redo log: 记录的是数据页的物理变化,服务宕机可用来同步数据\
undo log: 记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据
redo log: 保证了事务的持久性,undo log保证了事务的原子性和一致性
mvcc:
指一个数据的多个版本,使得读写操作没有冲突
------阿岩~的随手笔记
预告:
道友们让我出一篇关于Mysql基础的教程.拿我下一篇会将Mysql基础以笔记的形式记录下来