悲观锁和乐观锁_带你了解MySQL中的乐观锁与悲观锁
在并发控制编程中锁是一个非常重要的概念,锁对于数据和业务一致性的保证起到关键作用,锁可以是程序层面的,也可以是数据库层面的,今天本文就通过MySQL来说明悲观锁与乐观锁两种常见的锁机制。
悲观锁
悲观锁(Pessimistic Lock)的特点是先获取锁,在进行数据操作,最后释放锁。即先锁后查再更新,使用悲观锁的“悲观”的认为是这种获取锁的的可能是非常小的,因而需要确保获取到锁后再进行操作。这种操作在MySQL中的典型例子就是“select * from goods where id=5 for update”。但是在这种操作下,需要考虑以下情况。
使用for update“”的时候要注意此语句必须要放到事务中执行,等待事务提交或者回滚后才会释放锁,锁住的行才能允许被其他事务访问。
在for update的时候,被扫描的行都会被锁住,所以需要尽可能的保证扫描的行少,一般都是锁在索引列上面,否则最坏的情况可能导致全表被锁,影响其他业务。
乐观锁
乐观锁(Optimistic Lock)的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。
通过上述例子可以看到,乐观锁在原有数据没有改变的基础上(版本号没有发生改变)操作成功,改变了回滚进行重试或者其他操作。乐观锁一般需要通过正确的去维护一个版本号字段来进行并发控制。
总结
在取锁的失败率比较低的情况下乐观锁的开销是较小了,反而取锁失败过高导致事务回滚的开销就比较大。悲观锁在取锁概率较小和业务不是非常复杂的系统中用的还是比较普遍。
好啦,今天的内容就分享到这里,喜欢的话来个转发关注吧!
悲观锁和乐观锁_带你了解MySQL中的乐观锁与悲观锁相关推荐
- mysql 获取距离当前最新的记录_一文带你了解 MySQL 中的各种锁机制!
云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁,其中按用法还分为共享锁和排他锁. 行级锁 ...
- 一文带你了解 MySQL 中的各种锁机制!
MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁,其中按用法还分为共享锁和排他锁. 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁. 行级锁能大大减少数据库操作 ...
- 一文带你了解MySQL中的各种锁机制!
云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁,其中按用法还分为共享锁和排他锁. 行级锁 ...
- mysql中如何查看表是否被锁
https://blog.csdn.net/love666666shen/article/details/122419330 如何查看是否发生死锁 在使用mysql的时候,如何查看表是否被锁呢? 查看 ...
- mysql中的乐观锁_MySQL中悲观锁和乐观锁到底是什么?
索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁.行锁就是按照 ...
- mysql是表级锁还是行级锁_带你了解MySQL数据库中的全局锁、表级锁、行级锁
在 MySQL 数据库中,有很多各种各样的锁,这些锁大致可以分为三类:全局锁.表级锁.行级锁.这篇文章小编就带你简单了解一下这三种锁. 1. 全局锁 全局锁是粒度比较大的锁,基本上也使用不上,就像我们 ...
- sql输出带颜色的字段_带你走进MySQL数据库(MySQL入门详细总结一)
导读:关于MySQL用三篇文章带你进入MySQL的世界. 文章目录 1.MySQL 2.MySQL的使用 3.MySQL概述 4.导入数据 5.sql语句 1.查询 2.排序(升序,降序) 3.分组函 ...
- mysqlbinlog工具_带你解析MySQL binlog
前言: 我们都知道,binlog可以说是MySQL中比较重要的日志了,在日常学习及运维过程中,也经常会遇到.不清楚你对binlog了解多少呢?本篇文章将从binlog作用.binlog相关参数.解析b ...
- mysql的binlog意义_带你解析MySQL binlog
前言: 我们都知道,binlog可以说是MySQL中比较重要的日志了,在日常学习及运维过程中,也经常会遇到.不清楚你对binlog了解多少呢?本篇文章将从binlog作用.binlog相关参数.解析b ...
最新文章
- Qt5 使用 #pragma 加载 lib 文件的注意事项
- CSS3 box-reflect 属性
- .NET的未来包含一个开源的Mono
- 国家开放大学2021春1257混凝土结构设计原理题目
- 消息队列_消息队列:kafka
- 微软的云笔记:OneNote+SkyDrive
- kali 切换root权限_Ubuntu 被曝严重漏洞:切换系统语言 + 输入几行命令,就能获取 root 权限...
- 小程序中上传图片并进行压缩(二)
- ManualResetEvent使用说明
- Python中计算二重积分
- 分享我是如何找房东直租省中介费 租房 找房 直租 经验
- 廊坊金彩教育:店铺主图如何优化
- 向华为学习集成供应链管理:让产供销协同起来的供应链计划管理
- 世界战争英雄服务器怎么修改,世界战争-英雄 修改版
- 读一本好书,享一段时光
- 网站SEO优化诊断怎么做 分析诊断报告包含了哪些内容
- Java程序员的认证--SUN认证
- 什么是Operator Chains(算子链)?
- linux账号5天锁定,Linux学习之六(Linux用户、权限、用户管理命令)2017-03-31
- linux 常用命令之运行.sh文件
热门文章
- 深入理解Linux内存映射机制
- Centos 升级GLIBCXX3.4.25
- 使用maven构建dubbo服务的可执行jar包
- 多个left join 产生多个结果
- Android MediaPlayer使用方法简单介绍
- c语言if else语句_查找C程序的输出(如果为else语句)| 设置1
- java日历类add方法_Java日历computeFields()方法及示例
- Java PipedOutputStream connect()方法与示例
- git菜单形式的_添加“Git Bash Here”到右键菜单
- Redis夺命十二问,你能扛到第几问?