锁的由来

我们需要最大程度地利用数据库的并发访问,还需要确保每个用户以一致性的方式读取和修改数据,为解决此问题,有了锁的机制

InnoDB 存储引擎相对比MySQL 数据库的其他存储引擎在这方面要技高一筹

MySQL 常用引擎:InnoDB、MyISAM、Memory

锁机制用于管理对共享资源的并发访问,为了保证数据一致性和完整性,必须要有锁的介入

MySQL InnoDB 锁的基本类型

有两个概念的锁lock 和latch,这里着重聊聊lock 锁

latch 轻量级的锁,因为其要求锁定的时间必须非常短,如果持续的时间长,则应用的性能会非常差。在InnoDB 引擎中,latch 可以分为mutex(互斥)和rwlock(读写锁)。用来保证并发线程操作临界资源的正确性,并且没有死锁检测的机制

lock 的对象是事务,用来锁定数据库中的对象,如表、页、行。lock 是在事务commit 或rollback 后进行释放

在InnoDB 存储引擎中的latch,可以通过命令来进行查看

show ENGINE INNODB MUTEX;

MySQL InnoDB 锁的基本类型

两个行级别的锁(Shared and Exclusive Locks)和两个表级别的锁(Intention Locks)称为锁的基本模式

后面三个 Record Locks、Gap Locks、Next-Key Locks,我们把它们叫做锁的算法

锁的粒度

在InnoDB 里面既有行级别的锁,又有表级别的锁,来看下两者的区别

表锁:锁住一张表

行锁:锁住表里面的一行数据

锁定粒度,表锁肯定是大于行锁。另外,表锁的加锁效率要比行锁效率更高

共享锁

第一个行级别的锁shared locks(共享锁),获取一行数据的读锁以后,可以用来读取数据,所以它也叫做读锁,不要在加上了读锁以后去写数据,容易出现死锁的情况。

通过: select .... lock in share mode; 手工加上一把锁

共享锁是可以重复获取的,通过以下sql 可以进行验证

释放锁有两种方式,只要事务结束,锁就会自动释放,包括提交事务和结束事务

拍它锁

第二个级别的锁叫做Exclusive Locks(排它锁),用来操作数据又称写锁

排它锁加锁的方式

1)自动加排它锁。在操作数据的时候,包括增删改,都会默认加上一把排它锁

2)手工加锁,用一个FOR UPDATE 给一行数据加上一把排它锁

以上是两个行锁,接下来是两个表锁

意向锁

这把锁是由数据库自己维护的,我们在给一行数据加上共享锁之前,数据库会自动在这张表上面加一把意向共享锁;当我们给一行数据加上排他锁之前,数据库会自动在这张表上面加一个意向排他锁

这两把锁存在意义何在?

1)有了表级别的锁,在InnoDB 里面就可以支持更多粒度的锁

2)加表锁前可以不必去扫描整张表,只需要判断这张表上面有没有意向锁,如果有,就直接返回失败,没有的话,就可以加锁成功

在InnoDB 里的表锁,可以理解成一个标志

以上就是MySQL 4种基本锁的模式

锁的原理

锁住是什么?思考过吗?

是索引,锁是通过索引来实现的

场景:如果表中没有索引的时候,锁住一行数据会导致什么情况?一张表中可能会没有索引吗?

1)如果定义了主键(PRIMARY KEY) ,InnoDB 会选择主键作为聚集索引

2) 如果没有显示定义主键,InnoDB 会选择第一个不包含有 NULL 值的唯一索

引作为主键索引

3)如果也没有这样的唯一索引,则 InnoDB会选择内置6字节长的ROWID作为隐藏的聚集索引,它会随着行记录的写入而主键递增

先写到这里,后续会继续此篇内容,为故而知新

mysql 锁住一行数据_MySQL-锁相关推荐

  1. 大批量数据修改时发现有一行数据被锁住了,一直处于等待状态的问题解决

    最近写了个多线程任务处理组件用来处理大批量的业务数据, 从业务监控数据中发现少量业务数据修改时一直处于等待状态,很明显是出现类似 for update 锁表,锁行的情况. 这种问题是系统设计(复杂的业 ...

  2. mysql数据库的行级锁有几种_mysql锁之三种行级锁介绍

    本文主要介绍 1.mysql三种行锁介绍 2.RR模式下,next-key lock为什么可以解决幻读问题 首先,创建一张表: mysql> show create table test01\G ...

  3. mysql锁机制和索引_MySql锁机制及索引 · 十年饮冰,难凉热血

    一:ACID 原子性:对数据库的修改,要么都执行,要么都不执行 一致性:事务开始和结束时,都必须保持一致状态,事务结束时,索引等也必须完全正确 隔离性:事务处理过程中的中间状态对外部都是不可见的,反之 ...

  4. mysql 重构同步老数据_MySQL 重构查询的方式

    主题:如何重构查询冰战士何时需要使用这种技巧 (1)一种复杂查询还是多个简单查询 设计查询的时候需要考虑的一个重要问题是是否需要将一个复杂的查询分成多个简单的查询.在平时我们总是强调需要数据库完成尽可 ...

  5. mysql 查询导入的数据_MySql多表查询及数据导入

    MySQL高级 外键(foreign key) 定义 让当前表字段的值在另一个表的范围内选择 语法 foreign key(参考字段名) references 主表(被参考字段名) on delete ...

  6. mysql innodb myisam 插入数据_mysql innodb换成myisam后插入数据变快?

    myisam没有事务支持,它的连续的插入和查询速度都比Innodb快很多,但是如果需要插入和查询穿插着来,那么myisam是表锁,innodb是行锁,innodb的并发性好,并且innodb是支持事务 ...

  7. Oracle中事务锁(锁住的表、锁住的会话)

    1.查看锁住的表 SELECT b.owner,b.object_name,a.session_id,a.locked_modeFROM v$locked_object a ,dba_objects ...

  8. php mysql 插入多条数据_mysql如何插入多条数据?

    mysql插入多条数据的方法:1.使用"INSERT INTO 表名 字段列表 VALUES (值1) - , (值n);"语句插入数据:2.使用"INSERT INTO ...

  9. mysql 软件导出导入数据_MySQL 之 导出导入数据

    mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u root -p --databases db_name > test_db.sql       ...

  10. mysql命令导入导出数据_mysql命令行导入和导出数据

    MySQL中导出CSV格式数据的SQL语句样本如下: select * from test_info into outfile '/tmp/test.csv' fields terminated by ...

最新文章

  1. 为什么socket接收大数据的时候接收不完全,出现丢包?
  2. php 验证座机,验证国内手机号与座机号的正则表达式
  3. UA MATH565C 随机微分方程III Ito积分简介
  4. Android studio3.1卡顿严重
  5. python后台开发知识点_面试总结:鹅厂Linux后台开发面试笔试C++知识点参考笔记...
  6. 【技术文档】JEECG 页面字典控件与Popup使用
  7. quartz定时程序无故停止并且没有错误
  8. 对学生成绩表按计算机应用成绩排序,计算机等级考试EXCEL练习题-12学生成绩表2...
  9. java 一一对应的替换_java 如何实现按表替换
  10. 无废话Git——本地服务器提交撤销
  11. ebaz s9 zynq linux中关于网络的一些小问题
  12. C#租房管理系统(课程设计)
  13. ffmpeg音频文件格式转换(支持重采样采样位数为24位)
  14. gis差值分析_GIS空间插值分析图解
  15. 中兴新支点操作系统_中兴发国产操作系统新支点,好不好用测了才知道
  16. 已知两点,求两点与原点连线的角度
  17. 小红书销售情况(EDA/RFM)
  18. JS实现雪花飘落特效效果
  19. 自动化测试之-测试用例设计方法总结
  20. 带音效的计算机软件,音效增强软件哪个好用?好用的音效增强软件推荐

热门文章

  1. 如何注销/删除MSN帐号(Windows Live ID)
  2. pdf转换成word后有文字叠加_将PDF转换成Word文档后,为什么字体全变了?
  3. VIRTIO-BLK-DATA-PLANE的配置使用
  4. 浅析Simpson算法
  5. python功能主菜单_Pycharm主菜单学习
  6. Google设置新标签页默认地址
  7. Codecademy.com学习Python
  8. AES256加解密与异常处理
  9. python selenium模拟浏览器操作实战(武汉大学原教务系统)
  10. 服务器是Windows Server 2003 出现svchost.exe错误对话框的问题解决