事务原则
atomicity:原子性
consistency:一致性
isolation:隔离性
durability:持久性
事务问题
脏读:脏读指的是读到了其他事务未提交的数据。
不可重复读:一个事务内,不同时刻读到的同一批数据不一样了。通常针对数据更新操作(update)。
幻读:一个事务内,读到了其他事务提交的新数据。针对插入操作(insert)。
事务隔离级别
读未提交(read uncommitted):任何事务对数据的修改都会第一时间暴露给其他事务,即使事务还没有提交。会导致三类问题。
读提交(read committed):一个事务只能读到其他事务已经提交过的数据。会导致不可重复读,幻读。(流行级别)
可重复读(repeatable read):事务不会读到其他事务对已有数据的修改,即使其他事务已提交。会导致幻读。
串行化(serializable):将事务的执行变为顺序执行,后一个事务的执行必须等待前一个事务结束。
MySQL的可重复读级别
MySQL使用mvcc(多版本并发控制)原理。
每个事务一个版本,MySQL的rr级别是在事务开始的时候生成一个当前事务全局性的快照,事务在提交前重复读时返回快照的值。
解决并发写及幻读:并发写问题的解决方式就是行锁,而解决幻读用的也是锁,叫做间隙锁,MySQL 把行锁和间隙锁合并在一起,解决了并发写和幻读的问题,这个锁叫做 Next-Key锁。
假设有以下两条记录的表
数据库中维护一套有序的B+树来快速定位行记录。
事务A的update操作会为 age=10 加行锁,为age<10和10<age<30加间隙锁,事务B的insert操作因此阻塞直到事务A提交才能执行。
这是有索引的情况,如果 age 不是索引列,那么数据库会为整个表加上间隙锁。