事务
目录
事务
-
事务是什么
- 事务就是要么全部完成 要么全部失败 目的是为了保证数据的一致性
-
事务的ACID
原子性保证全部完成 要么全部失败 没有中间状态 他是靠undo日志来实现的持久性事务修改后的数据会一直存在 他是靠redo日志来实现的隔离性多个事务之间不会互相影响,他是靠MVCC也就是undo log来实现的一致性多个事务修改数据后 数据都是一致的
-
事务的隔离级别(InnoDB引擎中, 定义了四种隔离级别供我们使用 级别越高性能越低 而隔离性是由mysql的各种锁和MVCC机制来实现的)
读未提交我们可以去读事务未提交的数据,会带来 脏读,不可重复读,幻读的问题读已提交我们只可以去读事务已经提交的数据,会带来不可重复读,幻读的问题可重复读一个事务不管读取多少次,读的都是以第一次读的快照为标准,会带来幻读的问题串行化直接串行,一个事务一个事务来,这样效率就会及其低下
-
事务当中存在的可能问题
脏读事务A正在修改数据,事务B去读了,随后A发生了问题callback,B读取的数据就会无效不可重复读事务A正在更新数据,事务B去读数据了,随后事务A更新完毕,事务B再去读取,发现前后数据不一致幻读事务A正在插入数据,事务B读取全部数据,在事务A插入前后读取数据不一致 发现数据多了一行
-
事务4大隔离级别实现原理
-
串行化
排他锁和共享锁来实现的- 读锁(共享锁,S锁)
select ... lock in share mode;- 读锁是共享的,多个事务可以同时读取同一个资源,但不允许其他事务修改
- 写锁(排他锁,X锁)
select ... for update;- 写锁是排他的,会阻塞其他的写锁和读锁,update、delete、insert都会加锁
- 读锁(共享锁,S锁)
-
可重复读 & 读已提交
- 他们俩是靠MVCC机制来实现的
-
Copy On Write
- 什么是COW
写入时复制当有写入操作时 将原表copy一份 专门供来修改 如果此时有查询操作 则就查询原表,等新表写入完成在替换原表- 经常用于 读多写少 高并发的场景下,但是不单单只用于该场景
MVCC
- 什么是MVCC
- 多版本控制链
- 他跟COW还是很像的,都是在并发下保证数据安全 并且提高效率
- MVCC如何实现的
- 在我们的undo-log记录的数据表中 其实是有两个字段 一个是记录着事务的唯一ID,一个是回滚指针指向上一个事务
- 比如我们现在update一个数据 那么这个更新后的数据的回滚指针就会指向之前的数据,后面也是一样的道理 所以就形成了一个多版本控制链
小谈阿里面试题 - 查询操作方法需要使用事务吗
这种题其实大部分都要视情况而定, 如果你在查询的时候只有一条sql语句 那肯定是没必要开启事务的 但是如果你在导出的场景下 而且隔离级别是可重复读的情况下 导出的数据肯定是需要同一个时间维度的数据 所以这时候需要开启事务,否则就会导致导出的数据中 数据其实不是同一个时间维度的数据
MySQL执行过程与BufferPool缓存机制
- mysql为何要如此设计
- 因为mysql要为其性能考虑,kafka为何吞吐量这么高,因为他的写入数据是顺序写,顺序写的性能是相当高
- mysql写入
redo-log的时候就是顺序写,但是通过IO线程写入ibd确实随机写,虽然可以优化,但是性能肯定是比不过顺序写
- redo-log 为何可以顺序写,ibd确实随机写
redo-log他是记录日志 记录日志本来就可以直接添加在文件末尾的,不会插入或者写在开头- ibd却不一样 我们有多个ibd 因为表有多个,随后我们写数据可能会插入,开头也插入一个数据,所以这里就必须随机写