1.mysql事务基本概念
事务特性 ACID
A 原子性
I 隔离性
D 持久性
C 一致性
并发问题
脏读 读取到未提交的数据。
不可重复读 两次读取结果不同
幻读 select操作得到的结果所表征的数据状态无法支撑后续的业务操作。
隔离级别
2.mysql事务实现原理
MVCC
●多版本并发控制
●解决读写冲突
●隐藏列
当前读
Select for update 来获取当前的记录的最新版本,
除了表本身的列外,还有两个隐藏列 DB_TRX_ID和DB_ROLL_PIR。
快照读
普通的select 就是只去查询当前的某一个TRX_ID 造成可重复读。
##########MVCC#########
通过进行可见性判断
》创建快照的这一刻,还没提交的事务;
》创建快照之后创建的事务
Read View
》快照读 活跃事务列表
》列表中最小事务ID
》列表中最大事务ID
############UNDO LOG#############
》回滚日志,用来保证事务的原子性
》实现数据多版本
》delete undo log:用于回滚,提交即清理
》update undo log 用于回滚,同时实现快照读,不能随便删除。
提问:
undo log如何清理?
依据系统最小的活跃事务ID Read view,在最小事务ID前的就可以删除。
############REDO LOG##############
记录数据的修改
用于异常恢复的场景
循环写文件
》Write Pots 写入位置
》Check Points 刷盘位置
》Check Point->Write Pots 待落盘数据
##redo log写入流程
》记录页的修改,状态为prepare
》事务提交。将事务记录为commit状态
###刷盘时机
刷盘时机 代表着数据的可靠性,将数据写到磁盘里。
innodb_flush_log_at_trx_commit
有三种刷盘方式:
(1)事务提交后,将数据放在Log Buffer(DB)里,每1s落盘一次,如果db挂掉,就丢失1s的数据;
(2)事务提交后,实时将数据进行落盘,这样性能较差;
(3)事务提交后,将数据放在OS Buffer里,每1s落盘一次,如果OS挂掉,就丢失1s的数据;(OS挂掉的概率小于DB挂,因此选择此方法)。
redo log 的意义
》体积小,记录页的修改。比写入页代价低;
》末尾追加。随机写变顺序写,发生改变的页不固定。



