美文网首页
乐观锁与悲观锁——解决并发问题

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

作者: 火鸡不肥 | 来源:发表于2019-03-08 13:38 被阅读0次

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

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

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

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

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

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

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

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

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

相关文章

  • Spring Elasticsearch data 乐观锁并发控

    Spring ElasticSearch data 乐观锁并发控制 乐观锁与悲观锁 悲观锁(Pessimistic...

  • MySQL悲观锁与乐观锁的实现方案

    我们知道Mysql并发事务会引起更新丢失问题,解决办法是锁,所以本文将对锁(乐观锁、悲观锁)进行分析 悲观锁和乐观...

  • 面试官一次次问Java的锁时,你是怎么回答的?80%的人都说不完

    乐观锁与悲观锁 乐观锁和悲观锁都是用于解决并发场景下的数据竞争问题,但是却是两种完全不同的思想。它们的使用非常广泛...

  • 关于java中的锁的理解

    乐观锁与悲观锁 乐观锁和悲观锁都是用于解决并发场景下的数据竞争问题,但是却是两种完全不同的思想。它们的使用非常广泛...

  • ES并发冲突问题与悲观锁与乐观锁并发控制

    1、ES并发冲突问题 2、悲观锁与乐观锁两种并发控制解决方案 悲观锁的优点是:方便,直接加锁,对应用程序来说,透明...

  • MySQL的锁

    1、乐观锁与悲观锁是两种并发控制的思想,可用于解决丢失更新问题:乐观锁会“乐观地”假定大概率不会发生并发更新冲突,...

  • 使用MySQL悲观锁解决电商扣库存并发问题

    昨天写了乐观锁《使用MySQL乐观锁解决电商扣库存并发问题》,有人提出想看悲观锁,所以今天我们就说一说如何抗悲观锁...

  • 锁的概述

    乐观锁与悲观锁 悲观锁 乐观锁和悲观锁的概念出自数据库,但在java并发包中也引入和类似的概念(乐观锁/悲观锁是一...

  • ElasticSearch 7.x 实战入门06

    本节的主要内容:ES的乐观锁并发控制原理以及模拟过程 1、ES的乐观锁并发控制 1.1、悲观锁与乐观锁 悲观锁的优...

  • 乐观锁与悲观锁

    乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段 悲观并发控制(悲观锁) 它可以阻止一个...

网友评论

      本文标题:乐观锁与悲观锁——解决并发问题

      本文链接:https://www.haomeiwen.com/subject/jwcrpqtx.html