MySQL:行锁、表锁、乐观锁、悲观锁、读锁、写锁
1、锁的分类
1.1从对数据操作的类型来分
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
结论1:
--如果某一个会话 对A表加了read锁,则 该会话 可以对A表进行读操作、不能进行写操作; 且 该会话不能对其他表进行读、写操作。
--即如果给A表加了读锁,则当前会话只能对A表进行读操作。
结论2:
会话0给A表加了锁;其他会话的操作:a.可以对其他表(A表以外的表)进行读、写操作
b.对A表:读-可以; 写-需要等待释放锁。、
某回话给某个表加了读锁,所有的回话都能对该表进行读操作,不能进行写操作,除非该会话释放读锁。
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
当前会话(会话0) 可以对加了写锁的表 进行任何操作(增删改查);但是不能 操作(增删改查)其他表
其他会话:对会话0中加写锁的表 可以进行增删改查的前提是:等待会话0释放写锁
2.2从锁粒度划分。
一般分为:行锁、表锁、库锁
(1)行锁:访问数据库的时候,锁定整个行数据,防止并发错误。 如InnoDB存储引擎使用行锁
(2)表锁:访问数据库的时候,锁定整个表数据,防止并发错误。 如MyISAM存储引擎使用表锁
行锁 和 表锁 的区别:
- 表锁: 开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突概率高,并发度最低
- 行锁: 开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高
2. 3 补充 悲观锁 和 乐观锁
(1)悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
(2)乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
(3)悲观锁 和 乐观锁的区别:
- 乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大,因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能
- 乐观锁还适用于一些比较特殊的场景,例如在业务操作过程中无法和数据库保持连接等悲观锁无法适用的地方
小结:
MySQL表级锁的锁模式
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,
在执行更新操作(DML)前,会自动给涉及的表加写锁。
所以对MyISAM表进行操作,会有以下情况:
a、对MyISAM表的读操作(加读锁),不会阻塞其他进程(会话)对同一表的读请求,
但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b、对MyISAM表的写操作(加写锁),会阻塞其他进程(会话)对同一表的读和写操作,
只有当写锁释放后,才会执行其它进程的读写操作。
转载于:https://www.cnblogs.com/xiaowangbangzhu/p/10436848.html
MySQL:行锁、表锁、乐观锁、悲观锁、读锁、写锁相关推荐
- MySql事务4种隔离级别以及悲观锁和乐观锁
前言:在那鬼公司呆着发现自己居然把事务给搞明白了. 缘由:公司做的一个项目在进行首页内容显示的时候发现查询结果特别慢,有时候需要一到五分钟才能显示出结果.于是乎,我就顺着SQL语句查询慢的原因找了下去 ...
- [MySQL] mysql 的行级显式锁定和悲观锁
[MySQL] mysql 的行级显式锁定和悲观锁 隐式和显式锁定: 1.innodb是两阶段锁定协议,隐式锁定比如在事务的执行过程中.会进行锁定,锁只有在commit或rollback的时候,才会同 ...
- 【Java锁体系】一、悲观锁和乐观锁
目录: [Java锁体系]一.悲观锁和乐观锁 [Java锁体系]二.Java中的CAS机制算法 [Java锁体系]三.自旋锁详解 [Java锁体系]四.Synchronized关键字详解 [Java锁 ...
- mysql锁总结知乎_Mysql悲观锁乐观锁区别与使用场景
概念上区别 乐观锁(Optimistic Locking):顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,"乐观"的认为加锁一定会成功的,在最后一步 ...
- mysql乐观和悲观锁实现_mysql实现乐观锁和悲观锁该怎么编写?
乐观锁和悲观锁相信大家都是知道的,这是java中的基础知识,今天我们就来看看它们两者该如何使用代码实现吧. 乐观锁实现 1).表设计 表task,分别有三个字段id,value.version 2). ...
- mysql锁表查询_Mysql upate 更新锁表还是锁行测试
mysql 学习 主题: -- 查询是否自动提交事务select @@autocommit;--关闭自动提交事务set autocommit = 0;--开启--执行--结束 事务start tran ...
- mysql中锁原理及for update悲观锁的详解
mysql 中有多种多样的锁,今天我们具体分享一下: 一.mysql中乐观锁和悲观锁原理及种类: 乐观锁并不是数据库自带的,如果需要使用乐观锁,那么需要自己去实现,一般情况下,我们会 ...
- 悲观锁和乐观锁_浅谈数据库悲观锁和乐观锁
现在我们简单聊一下数据库中的悲观锁和乐观锁. 悲观锁 悲观锁正如其名称,比较悲观.总会认为:每当修改数据时,会有其他线程也会同时修改该数据.所以针对这种情况悲观锁的做法是:读取数据之后就加锁(eg: ...
- mysql查询数据会不会锁表_mysql select是否会锁表 ?
mysql select是否会锁表 ? 有的人说mysql的 select 会锁表 ,有的人说 mysql 的查询不会锁表 . 其他他们都对,没有 ,但是很片面. 其实对于mysql的select 是 ...
- Java 独占锁ReentrantLock、读(悲观读)写锁ReentrantReadWriteLock、读(乐观读/悲观读)写锁StampedLock
1.AbstractQueuedSynchronizer 锁必然要知道AbstractQueuedSynchronizer(AQS),AQS提供了一个框架,用于实现依赖于先进先出(FIFO)等待队列的 ...
最新文章
- k-NN最近邻算法(k-nearest neighbors algorithm)
- SQL2008R2 express版本不支持维护计划
- .net 调用命令行进行解压缩
- Leetcode232使用栈实现队列
- 3 了解MyBatis映射文件
- 自定义控件详解(四):Paint 画笔路径效果
- PHP 发送HTTP post请求发送和获取
- emplode php|,字符串的分割/组合/逆序等
- ECMAScript 6 基础入门
- 解决Mac osx AirPort: Link Down on en1. Reason 8 (Disassociated because station leaving)
- I,P,B帧和PTS,DTS的关系,GOP相关
- c语言 步进电机 程序,步进电机c语言控制程序
- POJ 1265 Area (皮克公式+多边形面积)
- 网易邮箱登录php,PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
- 诗歌三 不积跬步,无以至千里
- vue.js 知乎_zhihu每日水疗中心与vue.js
- 计算机网络:学习笔记(持续更新)
- CF 869 A. The Artful Expedient【异或】
- 为什么z-index在众多标签中失效
- Oracle 临时表空间操作
热门文章
- python实现字典树 时间复杂度_Python实现字典树
- python正则表达式提取电话号码_Python学习笔模式匹配与正则表达式之电话号码和Email地址提取程序...
- 【springboot】【若依(ruoyi)】@RestController 接口跨域请求
- 【linux】截断日志文件
- 粤教版管理计算机中的文件教案,最新粤教版初中信息技术第一册教案(全册).docx...
- 连接虚拟机mysql无法访问_连接虚拟机mysql无法访问,报错编号1130的解决方法
- linux哪个命令可以切换工作目录?如何显示当前所在的目录,Linux cd命令:切换目录...
- jlink v9可升级固件‘_STM32WB的硬核功能 - 无线固件升级FUOTA
- mac catalina删除系统多余文件 内存不足_macOS Catalina Patcher(如何在旧mac上安装Catalina系统)...
- SSL/TLS协议运行机制的概述