mysql应对并发设立了四种事务机制:
- READ UNCOMMITED
- READ COMMITZED
- REPEATABLE READ
- SERIALIZABLE
以上按照串行程度排序
READ UNCOMMITED只要有人修改,我都能读到,不论是不是commited,但这有问题,万一A修改了,B读,A发现不对rollback,结果B就读到错的了,寄。
READ COMMITED别人提交了修改我才能读到,但假设一种情况,A开始一个事务,A读一个数据x,B更新x为x’,A再读发现变成x’了,前后数据结果不一样,也就是说一个事务里我想读的表会变,寄。
REPEATABLE READ,A开启事务,即使B修改了,A也不管,按照当前快照执行,但是B加了数据可能会寄
不可重复读现象和幻读有啥区别:
实际上二者描述的都是前后读取结果不一致
前者侧重于有人UPDATE了数据,也就是同一条数据前后不一致
后者侧重于有人INSERT了数据,也就是说在一个范围内查询,筛选出来的结果不一样(比如WHERE id > 1)