乐观锁与悲观锁——解决并发问题

这几个锁按照属性可分为:乐观锁、悲观锁(共享锁,排他锁),行锁、表锁指的是锁粒度。

  1. 乐观锁
    乐观锁就是很乐观的认为,别人不会修改自己要拿的数据,不需要上锁。只是在更新的时候,判断下数据是否发生了变更(可以通过版本号来实现),如果发生变更,就重新取数据,更新数据时,再次判断是否变更···

     

  2. 悲观锁
    悲观锁就是很悲观的认为,自己取数据时,别人一定会修改,因此直接给要拿的数据加上锁,知道更新完释放了锁,才允许别人修改。
    根据加锁对象的不同分为行锁表锁(Mysql,只有Innodb存储引擎才有行锁,MyIsam只有表锁),以及加锁机制不同分为共享锁和排他锁。

    • 行锁和表锁
      MyISAM 操作数据都是使用的表锁,更新一条记录就要锁整个表,因此性能较低,并发不高。但同时不会存在死锁问题。

      InnoDB 与 MyISAM 的最大不同有两点:一是支持事务;二是采用了行级锁。

      在 Mysql 中,行级锁并不是直接锁记录,而是锁索引。
      索引分为主键索引和非主键索引两种,如果一条sql 语句操作了主键索引,Mysql 就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。

      InnoDB 行锁是通过给索引项加锁实现的,如果没有索引,InnoDB 会通过隐藏的聚簇索引来对记录加锁。也就是说:如果不通过索引条件检索数据,那么InnoDB将对表中所有数据加锁,实际效果跟表锁一样。因为没有了索引,找到某一条记录就得扫描全表,要扫描全表,就得锁定表。

    • 排他锁和共享锁
      数据库的增删改操作默认都会加排他锁,而查询不会加任何锁。
      共享锁:对某一资源加共享锁,自身可以读该资源,其他人也可以读该资源(也可以再继续加共享锁,即 共享锁可多个共存),但无法修改。要想修改就必须等所有共享锁都释放完之后。语法为:
      select * from table lock in share mode

      排他锁:对某一资源加排他锁,自身可以进行增删改查,其他人无法进行任何操作。



作者:火鸡不肥
链接:https://www.jianshu.com/p/ea819f020a65
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值