Innodb中的锁机制

使用数据库的目的在于数据共享,需要考虑数据并发访问问题。解决方案就是锁机制
锁主要包括全局锁、表锁、行锁、乐观锁和悲观锁,需要解决的问题是死锁

存储引擎

存储引擎定义MySQL中的数据、索引以及其它的数据库对象如何存储,是一套文件系统的实现
查看所有的存储引擎 show engines;

常见的存储引擎:MyISAM、Innodb、memory

  • MyISAM采用的是全表锁,具有较高的查询执行速度,不支持事务和外键,并发性能差,但是占用空间相对较小,对于事务没有要求,一般主要以select和insert为主的应用可以使用这个引擎
  • Innodb采用的是行级锁,可以提供具有提交、回滚和恢复能力的事务安全,支持自增长类,支持外键约束,并发性能强,一般所需要占用的空间是MyISAM的2.5倍以上,处理效率相对差一些
  • Memory采用的是全表锁,存储数据在内存中,速度快,但是占用和数据量成正比的内存空间,而且数据在MySQL重启时丢失,默认使用hash索引,检索效率高,但是不适合范围查找,主要用于缓存内容变化不频繁的表
  • archive 这种类型的表只支持insert、select,不支持delete、update、replace,不使用索引
  • csv这些表保存在服务器的单个文件中,它包含了用逗号间隔的数据。

Innodb和MyISAM的区别

  • Innodb支持事务,MyISAM不支持,Innodb针对每条SQL语句都默认封装为事务,自动提交,这样会影响执行速度
  • Innodb支持外键约束,MyISAM不支持。所以对于一个包含外键的innodb表转换为MyISAM会失败
  • Innodb采用的时聚集索引,数据文件和索引绑定,必须有主键,通过主键查询效率很高;但是辅助索引需要两次查询,因此在Innodb中主键不应该过大;MyISAM采用的是非聚集索引,所以数据文件分离
  • innodb不保存数据的总行数,执行 select count() 需要全表扫描;而MyISAM使用一个变量保存了表的总行数,所以执行 count() 查询时速度很快
  • Innodb5.5-不支持全文索引,MyISAM支持全文索引,查询效率上MyISAM高
    选择依据:
  • 如果没有特殊要求,使用默认的innodb即可
  • MyISAM:以读取和插入为主的应用,比如博客系统、新闻网站等。搜索引擎采用NoSQL类型的数据库ES提供
  • Innodb:更新删除操作效率要求较高或者要求保证数据的完整性,同时考虑并发量要求高的场景
    下使用,例如OA之类的管理系统。因为支持事务和外键所以能够很好的保证数据完整性

Innodb存储引擎即支持行级锁,也支持表级锁,默认情况下使用行级锁。锁类型包括共享S锁、排他X锁、意向共享IS锁和意向IX排他锁。

    • 所谓的意向锁就是如果对一个节点添加意向锁就说明该节点的下层节点正在被枷锁,对任意一个节点加锁时,实际上必须先对它的上层添加意向锁
  • 意向锁就是为了让表锁可以快速感知是否有行级锁的存在,以防止表锁干扰行锁的执行

表级锁

锁的颗粒度为整个表
lock tables 表名称 read/write ,其中read是共享锁,一旦锁定则共享读取数据,write是排他锁,
只有加锁的客户端可以读写,其它客户端不可读也不可写
解锁 unlock tables

行级锁

锁的颗粒度为表中的特定的一行或者多行
共享锁 select * from 表名称 where 条件 lock in share mode;
排他锁 select * from 表名称 where 条件 for update;
注意:所谓的行锁并不是直接锁定特定行的数据,实际上是锁定一个子范围,所以也称为间隙锁。例如
select * from tb_student where id<20 lock in share mode 实际上并不是锁定id<20的现有数据,而是锁定id<20的范围,例如插入id为18的新记录失败

死锁问题

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
常见的解决死锁的方法

  • 如果不同程序会并发存取多个表, 尽量约定以相同的顺序访问表,可以大大降低死锁机会。
  • 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
  • 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
    如果业务处理不好可以用分布式事务锁或者使用乐观锁
  • update tb_users set salary=? where id=1
  • update tb_users set salary=?,version=2 where id=1 and version=1 [version是一个额外的列,用于记录当前行的版本号]

查询缓存

可以缓存select语句的查询结果,以浪费内存为代价换取高执行效率
这个下载版本可能会有不能启动的问题,请大家使用其它版本进行测试
配置参数query_cache_type

  • 0 不开启
  • 1开启缓存,默认缓存所有select,如果需要不缓存则需要在select语句中添加sql-no-cache提示放弃缓存
  • 2开启缓存,默认都不缓存,需要在sql语句中添加select sql-cache主动缓存
    需要添加mysql配置文件,windows上my.ini,Linux上my.conf
    • query_cache_type=1
      查看MySQL是否开启缓存
    • show variables like ‘query_cache_type’;
      配置打开查询缓存大小
    • set global query_cache_size=6410241024; – 配置查询缓存为64M
    • show variables like ‘query%’;
      将查询结果进行
    • select sql_cache * from tb_users where …;
      重置缓存
    • reset query cache;

应用中的问题

1、应用程序不应该关心query cache的使用情况,因为使用查询缓存需要修改数据库的配置信息,所以实际上是由DBA决定的
2、缓存是以SQL语句为key进行存储的,因此即使SQL语句功能相同,然是如果多一个空格或者大小写有差异都会导致匹配不到缓存数据

数据库概述09(数据库中的锁机制)相关推荐

  1. MySQL数据库锁构建_MySQL数据库InnoDB存储引擎中的锁机制

    00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有 ...

  2. MySQL数据库InnoDB存储引擎中的锁机制--转载

    原文地址:http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化 ...

  3. 数据库中的锁机制(数据库中有哪些锁)

    数据库中的锁机制 锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性.各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别.目前,大多数数据库管理系统都 ...

  4. 【数据库】MySQL中的锁机制

    MySQL中的锁机制 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则. MySQL 数据库由于其自身架构的特点,存在多种数据存储引擎,每种 ...

  5. Java 并发编程解析 | 如何正确理解Java领域中的锁机制,我们一般需要掌握哪些理论知识?

    苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 提起Java领域中的锁,是否有种"道不尽红尘奢恋,诉不完人间恩怨"的 ...

  6. Postgresql杂谈 16—Postgresql中的锁机制

    今天,我们学习下Postgresql中的锁机制.锁是数据库事务的基础,通过锁才能保证数据库在并发时能够保证数据的安全和一致,才能够达到事务的一致性和隔离性.但是任何事物都有它的两面性,引入锁同样会增加 ...

  7. 【02】Java进阶:18-MySQL基础、数据库概述、数据库的安装/卸载/启动/登录、SQL概述、DDL操作数据库、DDL操作表、DML增删改查、

    day18-MySql基础 今日内容 数据库概述 数据库安装和卸载 SQL语句 DDL-----操作数据库,操作表 DML-----操作记录(增删改) DQL------操作记录(查) 学习目标 能够 ...

  8. Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除

    文章目录 1. Java中的锁机制 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 可重入锁(递归锁) 1.5 读写锁 1.6 公平锁 1.7 非公平锁 1.8 共享锁 1.9 独占锁 1.1 ...

  9. 3、数据库的事务、并发和锁机制

    1.事务 概念: 用户定义的一个数据库操作序列,这些操作要么全做.要么全不做,是不可分割的工作单位,同时事务也是恢复和并发控制的基本单位. 定义事务语句: begin transaction;开始事务 ...

最新文章

  1. 本地MySQL数据库要访问远程MySQL数据库的表中的数据的实现
  2. 图论浅析--最短路之Bellman-Ford
  3. NullPointerException
  4. 计算机网络管理员中级理论知识试卷06,计算机网络管理员中级理论+技能完整题库及答案...
  5. oracle 日志 安全审计,等保测评2.0:Oracle安全审计(下)
  6. java button jbutton_java程序将Button改成JButton,该如何改?
  7. poj 1656 Counting Black
  8. Leetcode994腐烂的橘子(宽搜)
  9. php返回代码翻译,php 在线翻译函数代码
  10. linux系统宝塔安装nodejs,node安装,nodejs安装,Windows nodejs安装,Linux nodejs安装
  11. element el-table 表格行列合并[{class1:‘1101‘,arr1:[1,2,3,5],class2:‘1102‘,arr2:[4,5,6],name:‘h‘}]
  12. 卡尔曼滤波理论小释之卡尔曼增益
  13. 929. 独特的电子邮件地址
  14. hamming code/汉明编码
  15. eregi html 标签,dede让文章标题页显示路径为标题拼音.html
  16. 全球及中国建筑机械LED灯行业销售现状及竞争战略建议报告2021年版
  17. Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
  18. 运用Python的turtle库绘制等边三角形
  19. 软件工程毕设题目大全 40个计算机毕业设计项目分享【含源码+论文】
  20. Jquery 小程序

热门文章

  1. 谷粒商城基础篇-1.分布式基础概念架构图与功能模块图
  2. qt.modbus: (RTU client) Discarding response with wrong CRC, received: 16448 , calculated CRC: 49303
  3. 开源LLM领域变天!LLaMa惊天泄露引爆ChatGPT平替狂潮
  4. Canvas学习笔记 Canvas的基础知识点
  5. 系统架构设计师论文历年考题(2015-2017)考前冲刺来一波真题
  6. vue路由跳转动画_vue怎么给路由切换时添加动画
  7. 【巴比特前端校招+笔试/一面/二面】
  8. 大规模线性方程组求解
  9. QT xml转ini的实现(从C#转到QT)
  10. python 横坐标只显示部分数据,Python使用matplotlib在x轴上显示特定值