首页 > 数据库 >MySQL(二十)锁(三)乐观锁与悲观锁、显示隐式锁和其他锁

MySQL(二十)锁(三)乐观锁与悲观锁、显示隐式锁和其他锁

时间:2023-05-09 14:13:37浏览次数:47  
标签:事务 lock mysql 隐式 死锁 悲观 MySQL id row

MySQL(二十)锁(三)乐观锁与悲观锁 显式锁和隐式锁

1 从对待锁的态度划分:乐观锁、悲观锁

  • 从对待锁的态度划分,可以将锁划分为乐观锁和悲观锁,可以看出这两种锁是两种对待数据并发的思维方式
  • 乐观锁和悲观锁并不是锁,而是锁的设计思想
1.1 乐观锁
  • 乐观锁对数据被其他事务修改持有乐观态度
  • 每次不会对数据上锁,而是在更新的时候判断一下其他事务有没有更新这个数据
  • 不需要借助数据库本身的锁机制,而是通过程序实现,如版本号机制或者cas机制
  • 乐观锁适用于多读的场景,能够提高吞吐量
乐观锁的版本号机制

​ 在表中设计一个version字段,每次在更新的时候更新一下这个字段,如果发生变化则更新失败,重新获取字段进行尝试:

update ... set version = version + 1 where `version` = version;
1.2 悲观锁
  • 悲观锁是一种思想,即对数据被其他事务修改持有悲观态度
  • 会通过数据库本身的锁机制(比如读写锁、表锁、行锁等)在每次获取数据的时候都进行加锁,其他事务想要获取数据就会堵塞直到它拿到锁。
  • 特别对于长事务,悲观锁对于数据库性能开销影响很大

注意点:

  • SQL语句SELECT ... FOR UPDATE就是MySQL中的悲观锁,会将扫描过程中的所有行都加锁

    这是因为MySQL加行锁是加到索引上的,所以如果使用锁没有用到索引,则会进行全表扫描,将全表索引都加上锁

  • 当一个事务执行SELECT ... FOR UPDATE,另一个事务执行SELECT ... 并不会收到影响,这是因为InnoDB存储引擎采取的是快照读,不会收到锁的影响

2 按照加锁的方式划分:隐式锁和显式锁

标签:事务,lock,mysql,隐式,死锁,悲观,MySQL,id,row
From: https://www.cnblogs.com/tod4/p/17384670.html

相关文章

  • MySQL(二十)锁(二)表锁、行锁与页级锁
    目录MySQL(二十)锁(二)表锁、行锁与页级锁从操作粒度的锁类型划分:表级锁、行级锁和页锁1表级锁(TableLock)1.1表级别的S和X锁1.2意向锁......
  • MySQL(二十一)MVCC多版本并发控制
    MySQL(二十一)MVCC多版本并发控制1什么是MVCCMVCC(MultiversionConcurrencyControl)多版本并发控制。即通过数据行的多个版本管理来实现数据库的并发控制,使得在InnoDB事务隔离级别下执行一致性读操作有了保障。就是为了查询一些正在被其他事务更新的值的时候,能够查到它们被更......
  • MySQL(十八)MySQL事务(二):事务的隔离级别
    MySQL(十八)MySQL事务(二):事务的隔离级别​ MySQL是一个客户端/服务器架构的软件,可以有若干个客户端与之连接,连接上之后都可以被称作是一个会话,每个客户端都可以在自己的会话中向服务器发出请求语句,一个请求语句可能是事务的一部分,因此对于服务器来说需要同时处理多个事务。由于事......
  • MySQL(十九)MySQL事务日志(一)RedoLog
    MySQL(十九)MySQL事务日志(一)RedoLog​ 事务的四种特性:原子性、一致性、持久性和隔离性都是基于什么机制实现的?事务的隔离性由锁机制实现而事务的原子性、一致性和持久性则由事务的redo和undo日志来实现的redolog是重做日志,提供再写入操作,恢复提交事务修改的页的操作......
  • mysql 索引
    mysql索引按存储方式区分: 一:b树,通常是使用b树这种方式,只有一个根节点,叶子节点之间彼此相连 二:hash,首先不能使用hash索引排序,并且它只支持等值索引,比如"=""in()""<=>"。 不支持键的部分匹配,因为计算hash值的时候是根据整体索引值来计算的。 建立hash索引相比b树需要更长的......
  • MySQL(十九)MySQL事务日志(二)UndoLog
    MySQL(十九)MySQL事务日志(二)UndoLog1undo日志概述​ redolog是事务持久性的保障,而undolog则是事务原子性和一致性的保证,如上图,在事务中更新数据的前置操作其实是需要将数据写入到undolog方便回滚。​ 事务需要保证原子性,也就是事务中的操作要么全部完成、要么全部不做。......
  • You have an error in your SQL syntax; check the manual that corresponds to your
    问题描述显示在条件查询的sql语句那里报错问题解决本来我是习惯了使用servlet写数据库操作的,然后就直接忽略掉了,或者说,直接忘记了在jsp里面的sql语句怎么正确书写了;经过查阅资料发现,查询语句是这样写的:Stringsql="select*frombookwhereid="+id;......
  • Centos7安装MySQL详细步骤(配置开机自启)
    MySQL检查系统是否安装过mysql//检查系统中有无安装过mysqlrpm-qa|grepmysql//查询所有mysql对应的文件夹,全部删除whereismysqlfind/-namemysql卸载CentOS7系统自带mariadb#查看系统自带的Mariadb[root@CDH-141~]#rpm-qa|grepmariadbmariadb-libs-5.5......
  • MYSQL查询【全部表】和表【所有字段】
    最近在做一些关于BI的东西。记录下。数据库查询全部表名称和备注信息只能查询表名SHOWTABLES; 查询表名和表备注SELECTTABLE_NAMEtablename,TABLE_COMMENTremarkFROMINFORMATION_SCHEMA.TABLESWHEREtable_schema="xxxx_xxxx"andT......
  • HTAP for MySQL 在腾讯云数据库的演进
    摘要:MySQL在充分利用多核计算资源方面比较欠缺,无法同时满足在线业务和分析型业务的客户需求,而单独部署一套专用的分析型数据库意味着额外的成本和复杂的数据链路。本次主题将介绍腾讯云数据库为满足此类场景而在HTAPforMySQL产品方面进行的尝试。2023首届云数据库技术沙龙MySQ......