mysql数据库学习之锁模块
不同的引擎对锁的支持也不相同,下面是常用的两种引擎的锁相关区别
首先用sql脚本导入100万行的数据分别到两种引擎对应的表中。
MyISAM
MyISAM默认使用表级锁,不支持行级锁
读锁(又称共享锁)
当一个会话查询
SELECT * FROM person_info_large_myisam WHERE id BETWEEN 1 and 200000
另一个会话会阻塞直到查询完成,才执行更新。
UPDATE person_info_large_myisam SET account=account WHERE id=99999
也可以手动加上读锁
LOCK TABLES person_info_large_myisam READ //加上读锁 锁住整个表
UNLOCK TABLES //解锁
当加上读锁后,此时只能对表执行读操作,其他操作会被阻塞
写锁(又称排他锁)
当一个会话进行如下更新操作时,数据库会给它加上写锁
UPDATE person_info_large_myisam SET account=account WHERE id BETWEEN 1 AND 200000
此时,另一个会话的读就会阻塞
SELECT * FROM person_info_large_myisam WHERE id=99999
也可以手动加上写锁
LOCK TABLES person_info_large_myisam WRITE //锁住整个表
当加上写锁后,所有操作都会被阻塞
InnoDB
InnoDB默认用的行级锁,也支持表级锁
又对于InnoDB的表,执行
SELECT * FROM person_info_large WHERE id BETWEEN 1 and 200000
另一个会话执行
UPDATE person_info_large SET account=account WHERE id=99999
此时居然执行成功了,并没有上读锁?
这是因为InnoDB为了提高性能,在read uncommited,read committed和repeatable read三种隔离级别下select操作是非阻塞的。即使使用了select语句还是没有上读锁。
这个时候可以手动加上共享锁
SELECT * FROM person_info_large WHERE id BETWEEN 1 and 200000 lock in share mode
lock in share mode这只是锁住了这一行
那排他锁怎么手动增加?
SELECT * FROM person_info_large WHERE id =99999 for update //使用for update即可,这是锁行
nnoDB在sql没有用到索引的时候会锁表而不是锁行,索引(一般是主键)不明确时也是锁表。比如
SELECT * FROM person_info_large WHERE id <99999 for update
SELECT * FROM person_info_large WHERE id like 99999 for update //这都会锁表
总结:
1.共享锁排他锁在两个存储引擎中都存在,只不过MyISAM是作用在表中,InnoDB是作用在行中.InnoDB也可以作用于表
2.在MyISAM引擎中增删查改都会自动上锁,在InnoDB中,select要主动上锁才行,增删改InnoDB会主动上锁.
3.MyISAM适用于频繁执行查询语句,对数据增删改的频率不高,没有事务的场景
4.InnoDB适用于增删改查相当频繁,可靠性要求高,需要支持事务的场景。
5.InnoDB在sql没有用到索引的时候,用的表级锁,sql用到索引的时候,用的行级锁
mysql数据库学习之锁模块相关推荐
- MySQL数据库学习日志(六):索引和视图
MySQL数据库学习日志(六):索引和视图 MySQL数据库学习日志(六):索引和视图 索引 (一)索引概述 (二)优缺点 (三)分类 1. 按照底层实现的方式 2. 按照功能划分 普通索引 唯一索引 ...
- linux数据库创建score表,MySQL数据库学习笔记
MySQL数据库学习笔记phpma (实验环境:Redhat9.0,MySQL3.23.54) 纲要: 一,连接MySQL phpma 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- mysql 数据库学习(触发器)
引用:http://bbs.mysql.cn/thread-9135-1-2.html 引用:21. 触发程序 create table a (sa int); create table b (sb ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL数据库学习导航
MySQL数据库学习导航 MySQL数据库基础知识 MySQL数据库备份 MySQL数据在线备份 MySQL数据库基础知识 MySQL数据库介绍 MySQL体系结构 MySQL语句 - sql语句 M ...
- MySQL 数据库学习(一)
MySQL 数据库学习 数据库 1. 数据库的介绍 2. 数据库的分类 3. 数据库的作用 4. 数据库的特点 5. 小结 MySQL数据库 1. MySQL数据库的介绍 2. MySQL数据库的安装 ...
- 研一寒假MySQL数据库学习笔记(三)
研一寒假MySQL数据库学习笔记(三) 本节记录数据库高级查询部分的内容,整理于此便于之后回顾. 1. 上一节补充内容 1.1 案例练习 现在有一个员工表.部门表,两张表之间是一个部门多个员工,一个员 ...
- MYSQL数据库学习总结
1.数据库概述 1.1.为什么要使用数据库 1.2.数据库与数据库管理系统 为什么要使用数据库? 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业 ...
最新文章
- 【每周NLP论文推荐】 NLP中命名实体识别从机器学习到深度学习的代表性研究
- 100w氮化镓充电器_SHARGE闪极-100W大功率氮化镓充电器体验
- 使用FakeAsync对Angular异步代码进行单元测试
- 浅谈 UNIX、Linux、ios、android 他们之间的关系
- 2021技术人新展望
- maven项目依赖被改为文件夹时如何改回lib
- hdu 1134 卡特兰数(大数模板)
- WORD 表格后面的空白页删不掉?
- 世界杯结束太快就像龙卷风,致意犹未尽的你
- poj2488-A Knight's Journey【DFS】
- Carrot2 在线版 知识图谱:以慢性胰腺炎为例
- WPS Office 2016 专业增强精简版 附终身授权正版序列号
- Android 4.0以上设备虚拟按键中显示Menu键
- php文件是不是死链,怎么判断网站的链接是不是死链接? 百度搜索标准死链官方文档...
- Spring Cache使用Redisson分布式锁解决缓存击穿问题
- 尚硅谷前端框架vue语法(二)
- iPhone打开个人热点的时候提示“请联系carrier”的解决方法
- 【笔记整理】通信原理第五章复习——模拟信号的数字化
- python如何增加字符串_在python中增加字符的方法
- linux安装Oracle 11g详解