关于幻读,可重复读,读已经提交

都是从网上看来,不对之处欢迎批评。

幻读意思为读到了别人已经提交的数据,但在RP隔离级别下,因为MVCC版本机制导致一个事务中读的数据都是一样的,所以感觉没有幻读的情况。因为select普通读为快照读,当进行select   lock in share mode时则为当前读,会读到别人插入的数据。解决办法用间隙读防止别人插入数据保证数据的一致性。

当对主键索引先进行查找时,若没有进行间隙锁,当别的事务进行插入一条之前不存在的数据时,在查找事务中再插入相同主键的事务时会报错,这也是一种幻读。

select * from t where a=1;属于快照读

select * from t where a=1 lock in share mode;属于当前读

其实感觉都解决了幻读的问题。出现的情况可能是,先普通读,其他事务插入,再当前读,出现新的数据。

在有主键索引的情况下,比如a事务读取了表id>9的数据,其他事务插入了id=12(假设之前12不存在),a事务再插入12的话则不行。

还有一种情况,当a事务对表所有4条name修改时,另一个事务进行插入新的一条并提交的话,a事务这边会显示修改五条。若出现此情况,可以在a事务开始时使用间隙锁查询出条数进行行锁,自己再对数据进行操作,其他数据则无法插入。若其他事务优先,则先读的话(for update/sharemode)是当前读,会读出最新的数据,避免了幻读,但其他事务插入不提交的话查询会出现锁等待。

mysql可重复读,指的是同一个事务读取的一致,别的事务提交了就不一样了,底层读取的事务艾迪不会
自动更新,读已提交则会更新,导致读的不一样。
mysql底层hash查找精确查找可以范围查找不行
mysql读已提交底层有事务编号,等某事物提交好,编号更新,即可读取
脏读:指的是读到了别人还未提交的数据
不可重复读:指的是别人已经提交数据,在一次事务中读到的数据不一样。
幻读:读到了别人插入的数据。
mvcc多版本控制里面:readcommit每次在select前都会生成readview,导致不可重复读,repeatble 隔离级别,在第一次select就生成了一个readview,在一次事务中一直用的这个版本。可以重复读。

读已提交:指的是事务提交后,底层版本艾迪变化,可以读出新数据(因为每次select都会读取版本),不会出现脏读(没提交就一直读一个版本),会出现后两个
可重复读:在事务提交后,另一个事务读取的艾迪不会变化(用的都是第一次的readview),即一次事务中读的数据一致,提交查询事务的话,再读就是最新的了。但会出现幻读

读锁:当读出数据后,其他事务不能修改,自己也不一定能修改,因为其他事务可以用共享锁进行锁住。
写锁:将查找的数据加上一个写锁,不允许其他事务获取这些记录的S锁与X锁。读出数据其他事务不能写,也不能加上读锁,只有自己可以读与修改。
写操作:
delete 删除一条数据时,先对记录加X锁,再执行删除操作
inset 插入一条记录时,会加隐式锁,来保护这条新插入的记录在本次事务提交前不被别的事务访问到
隐式锁:一个事务插入一条记录后,还未提交,这条记录会保存本次事务的ID,而其他的事务要式对这个记录加锁时会发现事务ID不对应,这时产生X锁,所以相当于插入一条记录时。隐式给这条记录加个X锁
update:如果被跟新的列,修改前没有导致存储空间的变化,那会先加X锁,再直接对记录进行修改。
如果被更新的列,修改前后导致存储空间发生了变化,那会给记录加X锁,然后将记录删掉,再insert一条新记录。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值