mysql事务、MVCC
一、事务是什么?有哪几大特性?
- 事务保证一组操作的一致性,要么全部成功要么全部失败
- 原子性:一组操作要么全部成功要么全部失败,使用undo log日志记录每一步的反向操作,要是中间出现异常就利用undo log回滚到最开始
- 隔离性:并发情况下事务之间互不干扰,读未提交、读已提交、可重复读、串行
- 持久性:多个事务完成后,mysql挂掉会丢失数据,采用redo log记录提交了的事务的操作,进行数据恢复
- 一致性:使用事务的目的,使最后数据一致
二、四种隔离级别产生的危害?
- 读未提交:会产生脏读,例如A读取B还没提交的事务,然后B进行回滚,A读取的数据就是没用的
- 读已提交:解决了脏读问题,但是会出现不可重复读问题,例如A读取了B的事务,但B对事务进行修改,A就需要再读B,否则不一致,可能一直保持这样的不一致
- 可重复读:做事务级别的快照,只会读取当前事务的版本,不被修改影响,会产生幻读(在一个事务内读取到了别的事务插入的数据,导致前后不一致),通过MVCC解决
三、MVCC知道吗?
- read view:用来管理版本信息
| 字段 | 作用 |
|---|
| trx_ids | 尚未提交的事务版本号集合 |
| up_limit_id | 下一次要生成的事务ID值 |
| low_limit_id | 尚未提交版本号的事务ID最小值 |
| creator_trx_id | 当前的事务版本号 |
- undo log:用来找到版本的数据