什么是悲观锁和乐观锁

ゝ一纸荒年。 2022-09-12 04:56 309阅读 0赞

1.什么悲观锁?

顾名思义,悲观锁是基于一种悲观的态度,来防止一切数据冲突,它是以一种预防的姿态,在修改数据之前把数据锁住,然后再对数据进行读写,在它释放锁之前任何人都不能对其数据进行操作,直到前面一个人把锁释放后,下一个人数据加锁,才可对数据进行加锁,然后才可以对数据进行操作,一般数据库本身锁的机制都是基于悲观锁的机制实现的;

特点:可以完全保证数据的独占性和正确性,因为每次请求都会先对数据进行加锁, 然后进行数据操作,最后再解锁,而加锁释放锁的过程会造成消耗,所以性能不高;

手动加悲观锁:读锁LOCK tables test_db read释放锁UNLOCK TABLES;

写锁:LOCK tables test_db WRITE释放锁UNLOCK TABLES;
在这里插入图片描述
2.什么是乐观锁?
乐观锁是对于数据冲突保持一种乐观态度,操作数据时不会对操作的数据进行加锁(这使得多个任务可以并行的对数据进行操作),只有到数据提交的时候才通过一种机制来验证数据是否存在冲突(一般实现方式是通过加版本号然后进行版本号的对比方式实现);

特点:乐观锁是一种并发类型的锁,其本身不对数据进行加锁,而是通过业务实现锁的功能,不对数据进行加锁就意味着允许多个请求同时访问数据,同时也省掉了对数据加锁和解锁的过程,这种方式因为节省了悲观锁加锁的操作,所以可以一定程度的提高操作的性能,不过在并发非常高的情况下,会导致大量的请求冲突,冲突导致大部分操作无功而返而浪费资源,所以在高并发的场景下,乐观锁的性能却反而不如悲观锁。

乐观锁实现形式:
表A 字段
在这里插入图片描述
现在有两个请求同时操作表A
操作1先查询出需要检索的数据为:
在这里插入图片描述
操作2也查询出需要检索的数据为:
在这里插入图片描述
操作1把Name字段数据修改成lisi 比操作2先提交;
此时提交操作1会把之前查询到的version与现在的数据的version进行比较,版本相同则可以提交,版本不同则视为数据过期:

  1. SQL语句:update A set Name=lisi,version=version+1 where ID=#{ id} and version=#{ version}

此时数据库变成了如下
在这里插入图片描述
那么最后操作2修改了数据来提交的时候是以操作1同样的方式,当然最后肯定不能提交成功,因为他手里的版本号和现在数据库里的版本号不匹配;
最后盗图一张来解释
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,309人围观)

还没有评论,来说两句吧...

相关阅读

    相关 什么悲观乐观

    1.什么悲观锁? 顾名思义,悲观锁是基于一种悲观的态度,来防止一切数据冲突,它是以一种预防的姿态,在修改数据之前把数据锁住,然后再对数据进行读写,在它释放锁之前任何人都不能对

    相关 悲观乐观

    1、悲观锁:    顾名思义,每次读取数据库的数据时,都假设会被它人修改,因此要加锁将数据锁住,防止被修改。   可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加

    相关 什么乐观悲观

    1)乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将 比较-设置 这两个动作作为一个原子操作尝试去修改内

    相关 悲观乐观

    这是一篇介绍悲观锁和乐观锁的入门文章。旨在让那些不了解悲观锁和乐观锁的小白们弄清楚什么是悲观锁,什么是乐观锁。不同于其他文章,本文会配上相应的图解让大家更容易理解。通过该文,你

    相关 什么乐观悲观

    乐观锁和悲观锁是一种程序设计思想,而不是具体的代码。乐观锁和悲观锁应用的场景有很多,在数据库和多线程等等都会用到。 悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为