快照读和当前读
- 快照读(snapshot read),读取历史数据,不是最新数据
- 简单select操作,select **
- 当前读(current read),读最新数据
- select ** lock in share mode
- select ** for update
- insert
- update
- delete
脏读
假如有以下表结构
create table test
(
id int auto_increment
primary key,
no varchar(11) null
);
INSERT INTO fb4.test1 (id, name) VALUES (1, 'a');
session1 | session2 |
---|---|
update test set name=‘a’ where id=1(原name=‘b’) | |
select * from test where id=1, | |
rollback |
在读未提交
事务级别下,session1修改了id为1的记录name值,session2读取到这个未提交的事务的修改值name=a,session1因为某些原因回滚,那么session2读取到name='a’称之为脏读。
不可重复读
session1 | session2 |
---|---|
select * from test where id=1,读取到name=‘b’ | |
update test set name=‘a’ where id=1(原name=‘b’) | |
commit; | |
select * from test where id=1,读取到name=‘a’ |
在读未提交
,读提交
事务级别下,在事务内重复读取同一条数据,出现列值被修改前后不一致的情况,称之为不可重复读。
幻读
session1 | session2 |
---|---|
select count(1) from test where id >= 2;结果1条 | |
insert into test values(2, ‘no2’); | |
commit; | |
select count(1) from test where id >= 2;结果2条 |
在读未提交
,读提交
事务级别下,在事务内相同条件重复检索记录,发现匹配记录数目改变,前后不一致的情况,称之为幻读。
RR(可重复读)级别中如何解决以上读问题
- 在快照读时:通过MVVC(多版本并发控制)(mvcc实现依赖undo log)来解决不可重复读和幻读
- 在当前读时:Next-key locks加锁来解决不可重复读和幻读
- 要解决脏读是通过提升事务级别实现