脏读、不可重复读、幻读和快照读、当前读

快照读和当前读

  • 快照读(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');
session1session2
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’称之为脏读。

不可重复读

session1session2
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’

读未提交读提交事务级别下,在事务内重复读取同一条数据,出现列值被修改前后不一致的情况,称之为不可重复读。

幻读

session1session2
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加锁来解决不可重复读和幻读
  • 要解决脏读是通过提升事务级别实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值