一、Mysql事务的隔离级别(default= 可重复读)。
1.读未提交。
开启事务A,开启事务B,A事务查询 age=13,B事务查询 age=13,接着,A事务更新age=14(事务不提交), A事务查询 age=14,B 事务查询age=14。
⚠️注意:存在【脏读,不可重复读,幻读】
2.读已提交。
开启事务A,开启事务B,A事务查询 age=13,B事务查询 age=13,接着,A事务更新age=14(事务不提交), A事务查询 age=14,B 事务查询age=13。当事务A事务提交之后,B事务查询 age=14。
⚠️注意:存在【不可重复读,幻读】
3.可重复读(MVCC,next-key-lock解决幻读)不是当前隔离级别解决的。
开启事务A,开启事务B,A事务查询 age=13,B事务查询 age=13,接着,A事务更新age=14(事务不提交), A事务查询 age=14,B 事务查询age=13。当事务A事务提交之后,B事务查询 age=13,当事务B提交时候,查询age=14。
⚠️注意:存在【幻读】
4.串行化。
完全串行话的读,每次读都需要获得表级共享锁,读写相互都会阻塞。
🏁重点:不可重复读 和 幻读的区别?
① 不可重复读:关注的是修改,同一条数据读取的数据是不一样的。
② 幻读:关注的是新增/删除,读取的条数发生了变化。
事务的特性:原子性,一致性,隔离性,持久性。
二、如何查看设置隔离级别。
a)查看mysql 版本:select version();
b)查看系统隔离级别:select @@gloabl.tx_isolation;
c)查看会话隔离级别(version=5):select @@tx_isolation;
d)查看会话隔离级别(version=8):select @@transaction_isolation;
e)设置会话隔离级别:set session transaction isolation level repeatable read;
三、如何选择隔离级别。
...待整理
四、隔离级别与并发事务。
a)上
b)中
c)下
五、Mysql 日志。
a)redo.log 重做日志
i.是InnoDB存储引擎层的日志。
ii.记录数据是修改之后的数据,不管事物是否提交都会记录,我们的一切操作,对于数据的修改,这些动作都会记录下来。
iii.可以保证事务的提交。
iv.先写日志,在写磁盘。对于数据的处理,先写入日志,再写磁盘,来保证数据的写入的高性能。
b)undo.log 回滚日志
i.记录数据发生之前的数据版本,也就是事物提交之后。
ii.可以用于回滚,数据回滚也就是事务的回滚。
iii.可以提供多版本并发控制下的读(MVCC),即非锁定度。
c)bin.log 归档日志 业务层面操作的日志
i.主从复制
ii.二进制的形式记录。
iii.基于时间点的数据还原。
提交事务记录binlog ,定时刷盘,不光是记录数据,会记录一些事件
六、多版本并发控制原理之-隐藏字段
a)上
i.DB_TRX_ID
1.6byte字节
2.记录创建这条记录时,最后一次修改改条记录的事物ID/最近修改插入事务ID。
ii.DB_ROLL_PTR
1. 7byte,回滚指针
2.指向这条记录的上一个版本(存储于rollback segment 回滚段里)
iii.DB_ROOW_ID
1.6byte,隐含的自增ID(隐藏主键)
2.如果数据表没有主键 a)InnoDB会自动以DB_ROOW_ID产生一个聚簇索引。 iv.创建版本号 v.删除版本号
七、多版本并发控制原理之-当前读和快照读。
a)什么是当前读?
i.select from update ;update ,insert ,delete
ii.当前读:读取的是当前最新记录的最新版本。
iii.读取时还要保证其他并发事务不能修改当前记录。
iv.会对读取的记录进行加锁。
b)什么是快照读?
i.不加锁的非阻塞读。
ii.快照读的隔离级别不是串行隔离级别,串行的隔离级别下的快照读会退化成当前读。
八、多版本并发控制原理之-读视图。
a)read-view(决定的是对其他事务数据的可见性的一个重要的因素
i.List (记录当前活跃事务的ID)
例如1:1,2,3
ii.Up ID (记录最小的事务ID)
例如1:1
iii.Low ID(记录下一个要分配的事务ID)
例如1:4
⚠️注意:可重复读级别,在首次读取的时候生成读视图,并且在当前的事务下进行传递。
⚠️注意:读已提交级别,在每次快照读时生成视图。
九、多版本并发控制原理之-数据可见性算法。
十、数据常见问题
① 数据库锁的有那几类?
a)行级-锁
i.共享锁,又指-读锁。
ii.排它锁,包括【插入,更新,删除,SELECAT * FROM UPDATE】。
b)页级-锁
c)表级-锁
d)记录锁
锁住的是索引,锁了索引,就是锁的索引树。
e)间隙锁
锁住的是个范围,间接的解决了幻读的问题。
② next-key-lock是什么?
待更新...
③ .............