MySQL 事务,四个特性
原子性
一致性
持久性:通过redolog实现,事务的修改会先放到buffer pool(内存),redolog(磁盘,顺序写)中,提交事务后会慢慢刷到磁盘,当服务器在刷到磁盘钱宕机了,重启后会通过redolog重新写。
隔离性:
读未提交:脏读,不可重复度,幻读
读提交:不可重复度,幻读
可重复度:
串行话:
脏读:读取到事务没有提交的数据
不可重复度:事务中几次读取到数据不一致,数据被修改
幻读:事务中几次读取到数据不一致,数据增加或者删除
读提交解决了脏读,在事务修改时加排他锁,读事务无法读取到为提交的数据
可重复读解决了,脏读,不可重复读,幻读,通过MVCC和间隙锁
RR隔离级别下:
MySQL的innodb在数据的后面增加了两列隐藏列,一个是DB_TRX_ID,一个是DB_ROLL_PTR
DB_TRX_ID:事务插入时的事务id
DB_ROLL_PTR:事务删除数据行时,会把当前的事务id放到这里
可重复读:事务读取时,
DB_TRX_ID:
会读取数据中事务id小于等于当前事务id的数据,因为小于等于当前事务id的数据行,代表数据行时在事务开始前或者当前事务中修改的数据
DB_ROLL_PTR:
会读取回滚事务id大于当前事务的id的数据行,会保证删除的数据行是当前事务之后的数据,
幻读:
快照读:MVCC的快照读解决了幻读,根据刚刚上述的读取隐藏列的规则
select * from table所有普通的select
当前读:间隙锁+行锁(next-key)
select * from table for update
select * from table lock in share mode
update table....
delete table....
快照读通过间隙锁防止幻读。
标题:重新理解MySQL的事务、redo log、undo log,bin log、MVCC、间隙锁、快照读、当前读
作者:hymn
地址:https://dxyhymn.com/articles/2021/02/20/1613800067573.html