mysql学习:事务
事务
- mysql的事务有什么特性
- A:原子性,由undo log实现
- C:一致性,由MVCC和锁实现
- I:隔离性
- D:持久性,由redo log实现
- 原子性具体是怎么实现的
- 事务还没提交之前,历史数据会记录在undo log里,如果半中间出错就可以用rollback语句回滚数据
- 持久性是怎么实现的
- redo log会把对数据页的修改记录下来,如果刷盘的时候出现重启,因为redo log已经记录了修改操作,所以再根据redo log执行即可
- 事务隔离级别有哪些,分别是解决哪些问题
- 问题
- 最基础的,脏写,这个基础情况下的事务就能实现
- 脏读,也就是回滚事务操作,事务还没提交,被另一个事务在中途读到了
- 不可重复读,指的是一个事务修改记录提交,另一个事务前后读取不一致
- 幻读,一个事务在读的时候,另一个事务趁机插入了一条符合的数据,导致前后查询结果不一致
- 事务隔离级别
- 读未提交,解决了脏写
- 读已提交,解决了脏读,MVCC会在每条sql语句执行后提供Read View
- 可重复读,解决了不可重复读,MVCC会在查询事务执行的时候提供Read View(默认)
- 串行化:解决了幻读,直接全局获取锁挨个排队
- MVCC是什么,原理是什么
多版本并发控制,就是生成readview来防止读取数据不一致
可见性是,每个事务都有自己的id,readview有四个字段,创建readview的事务id,min_trx_id创建readview的时候仍然活跃的事务里的最小id,max_trx_id同上,m_ids活跃但没提交的id列表
每行数据也有自己的id,记录了更新这个数据的事务id
创建的时候会判断,min代表已经提交了的事务,max表示还没开始的事务,在中间的记录就可以显示 - 可重复读解决了幻读吗
- 可重复读select语句就是通过快照MVCC读,select for update是通过间隙锁来读
- 如果是MVCC情况,仍然会有幻读的情况存在,比如A操作是快照读id为5的数据,实际上数据库没有,但是还没读到的时候,事务b插入了一条id为5的数据,此时就会导致这条记录的事务id还是A的,事务A再次查询就会不一致出现幻读
- 建议是开启事务后用select for update语句
- 问题
mysql学习:事务
http://example.com/2024/04/10/mysql学习:事务/