不同的引擎对锁的支持也不相同,下面是常用的两种引擎的锁相关区别

首先用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数据库学习之锁模块相关推荐

  1. MySQL数据库学习日志(六):索引和视图

    MySQL数据库学习日志(六):索引和视图 MySQL数据库学习日志(六):索引和视图 索引 (一)索引概述 (二)优缺点 (三)分类 1. 按照底层实现的方式 2. 按照功能划分 普通索引 唯一索引 ...

  2. linux数据库创建score表,MySQL数据库学习笔记

    MySQL数据库学习笔记phpma (实验环境:Redhat9.0,MySQL3.23.54) 纲要: 一,连接MySQL phpma 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 ...

  3. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. mysql 数据库学习(触发器)

    引用:http://bbs.mysql.cn/thread-9135-1-2.html 引用:21. 触发程序 create table a (sa int); create table b (sb ...

  5. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  6. MySQL数据库学习导航

    MySQL数据库学习导航 MySQL数据库基础知识 MySQL数据库备份 MySQL数据在线备份 MySQL数据库基础知识 MySQL数据库介绍 MySQL体系结构 MySQL语句 - sql语句 M ...

  7. MySQL 数据库学习(一)

    MySQL 数据库学习 数据库 1. 数据库的介绍 2. 数据库的分类 3. 数据库的作用 4. 数据库的特点 5. 小结 MySQL数据库 1. MySQL数据库的介绍 2. MySQL数据库的安装 ...

  8. 研一寒假MySQL数据库学习笔记(三)

    研一寒假MySQL数据库学习笔记(三) 本节记录数据库高级查询部分的内容,整理于此便于之后回顾. 1. 上一节补充内容 1.1 案例练习 现在有一个员工表.部门表,两张表之间是一个部门多个员工,一个员 ...

  9. MYSQL数据库学习总结

    1.数据库概述 1.1.为什么要使用数据库 1.2.数据库与数据库管理系统 为什么要使用数据库? 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业 ...

最新文章

  1. 【每周NLP论文推荐】 NLP中命名实体识别从机器学习到深度学习的代表性研究
  2. 100w氮化镓充电器_SHARGE闪极-100W大功率氮化镓充电器体验
  3. 使用FakeAsync对Angular异步代码进行单元测试
  4. 浅谈 UNIX、Linux、ios、android 他们之间的关系
  5. 2021技术人新展望
  6. maven项目依赖被改为文件夹时如何改回lib
  7. hdu 1134 卡特兰数(大数模板)
  8. WORD 表格后面的空白页删不掉?
  9. 世界杯结束太快就像龙卷风,致意犹未尽的你
  10. poj2488-A Knight's Journey【DFS】
  11. Carrot2 在线版 知识图谱:以慢性胰腺炎为例
  12. WPS Office 2016 专业增强精简版 附终身授权正版序列号
  13. Android 4.0以上设备虚拟按键中显示Menu键
  14. php文件是不是死链,怎么判断网站的链接是不是死链接? 百度搜索标准死链官方文档...
  15. Spring Cache使用Redisson分布式锁解决缓存击穿问题
  16. 尚硅谷前端框架vue语法(二)
  17. iPhone打开个人热点的时候提示“请联系carrier”的解决方法
  18. 【笔记整理】通信原理第五章复习——模拟信号的数字化
  19. python如何增加字符串_在python中增加字符的方法
  20. linux安装Oracle 11g详解

热门文章

  1. PostgreSQL 与 MySQL 相比,优势何在?
  2. WEB渗透测试(一)被动信息收集1(DNS信息收集、DNS字典爆破、DNS注册信息)
  3. 半年10倍的股票秘诀
  4. 脑壳疼,好好的系统,为什么要分库分表?
  5. 赵志博陕师大计算机科学学院,肖 冰
  6. 磁性开关 —— 干簧管的原理和应用
  7. 2017衢州联赛第四题题解
  8. Unity Excel转Json小工具excel2json
  9. 计算广告(1)---一些概念
  10. 使用C#启动默认Internet浏览器