mysql学习:事务

事务

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

mysql学习:事务
http://example.com/2024/04/10/mysql学习:事务/
作者
WoodQ
发布于
2024年4月10日
许可协议