事务隔离级别-锁的实现

隔离级别

  • 读未提交(Read uncommitted)

    写事务阻止其他写事务,避免了更新遗失。但是没有阻止其他读事务

    实现:事务写加行级共享锁,事务读不加锁

    问题:脏读,写事务没有阻止读事务,写事务执行还未提交期间,可能 被其他读事务读取到中间态不正确的数据。

  • 读以提交(Read committed)

    写事务阻止其他读/写事务。读事务不阻止其他事务

    实现:事务写加行级排他锁直到事务结束,事务读(读取瞬间)加行级共享锁(读完马上释放,不需要等待事务结束)

    问题:不可重复读(虚读),一个事务中读两次结果不同,在两次读期间可能有update操作导致两次读不一致

  • 可重复读(Repeatable read)

    写事务阻止其他读/写事务。读事务阻止其写事务

    实现:务写加行级排他锁直到事务结束,事务读(读取瞬间)加行级共享锁直到事务结束

    问题:幻读,一个事务读期间,由于insert操作(由于insert前这行数据不存在,所以不存在被锁住的情况)导致两次读取数据条数有差异

  • 可串行化(Serializable)

    写事务阻止其他读/写事务。读事务阻止其写事务

    实现:事务写加表级排他锁,事物读加表级共享锁

解决读问题

脏读:事务写加行级排它锁

不可重复读:事务读时加行级共享锁直到事务结束,或使用MVCC

幻读:事务读加表级共享锁,事务读加表级排它锁,或使用间隙锁

当然解决隔离级别高的解决办法也可以解决隔离级别低的问题

MVCC:并发版本控制,通过添加版本号
(系统版本号:递增。事务版本号:为加事务时的版本号)来解决并发读写问题。
InooDB:应用在每个记录后面隐藏两列
(创建版本号:创建一行时的系统版本号快照。删除版本号:删除一行时的系统版本号快照)
如果删除版本号 > 系统当前版本号 这个认为快照有效
间隙锁:在RR级别有索引的情况下,间隙锁对一段区间进行加锁(A,B)
        防止在数据行A-B中的间隙插入数据,或更新数据
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值