隔离级别:ACID
读未提交
读已提交
不可重复读
串行
- 脏读:事务A读取到了事务B还未提交的数据
- 不可重复读:事务A在多次读取某数据时,读取到了事务B已经提交(update、delect)的数据,导致事务A前后读取结果不一致
- 幻读:事务A在多次统计数据时,统计到了事务B已经提交的insert数据,导致事务A的前后统计结果不一致
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 | 备注 |
读未提交 (Read UnCommitted) | N | N | N | |
读已提交(Read Committed) | Y | N | N | Oracle 默认级别 |
可重复读( RepeaTable Read) | Y | Y | N | mysql 默认级别 |
串行(Serializable) | Y | Y | Y |
mysql是如何实现事务隔离级别的?
INNDB:表锁、行锁
MyISAM:表锁
加锁粒度 | 执行效率 | 冲突概率 | 并发性能 | |
表锁 | 大 | 快 | 大 | |
行锁 | 好 |
锁的模式
- 共享锁 S锁 :读可重入,即多个事务可在同一行加锁,但是不能修改,如果想要修改,只能等待所有的S锁释放;
例子:select * from table lock in share mode;
小插曲:老师用动物园出入口的闸机举例子,说明读锁的必要性。我却在把闸机联想成了炸鸡!!!!
- 排它锁 X锁:对某一资源进行修改时,只有此事务可以增删改查,其他事务都不能进行操作
例子:所有的DML语句自动带有排它锁;
- 意向锁 :由共享锁/排他锁触发,是为了提高加表锁的效率;
锁的算法
MVCC:
会记录最大的事务id,transcation_id,也就是row_id
快照读
当前读:也就是修改的时候,会再读取一遍数据库中最新的数据
面试题:问Q1 Q2的输出值?age初始值为18