1. 锁的粒度

在MySQL中,只要有多个请求需要在同一时刻修改数据,都会产生并发控制的问题。而锁的作用可以保证同一资源能被某个请求唯一使用。

加锁是会消耗系统资源的,包括获得锁、检查锁是否已解除、释放锁等等操作,都会增加系统的开销。

为了平衡锁的开销和数据的安全性,MySQL对锁的粒度提供了多种方式,主要分为表锁和行级锁。

表锁(table lock):指在加锁时锁定整张表。

行级锁(row lock):指在加锁时锁定某一行。

2. 共享锁和排他锁

在InnoDB存储引擎中,锁的类型通常分为共享锁和排他锁。

共享锁(shared lock):也叫读锁(read lock),指多个请求在同一时刻可以同时读取同一个资源,互相不干扰。

排他锁(exclusive lock):也叫写锁(write lock)。一个写锁会阻塞其他的写锁和读锁,这样能确保一定的时间内,只有一个请求能执行写入操作,防止其他请求读取或写入同一资源。

示例1:

事务T1对某一行R1进行了共享锁的加锁操作时,事务T2也可以对此行R1进行共享锁的加锁操作,但事务T2不可以对此行R1进行排他锁操作。

示例2:

事务T1对某一行R1进行了排他锁的加锁操作时,事务T2不能对此行R1进行任一类型的锁的请求,事务T2必须等待事务T1释放对行R1的锁定才能进行后续的加锁操作。

3. 死锁

死锁是指多个事务在同一个资源上互相占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。比如多个事务以不同的顺序锁定相同的资源就会产生死锁。

示例:

事务T1按顺序修改R1和R2行,事务T2按顺序修改R2和R1行,当2个事务同时执行,在执行第2行时发现此行都已经被别的事务进行了排他锁操作,就会陷入恶性循环中。

解决方案:

在InnoDB中的方案是将最少行级排他锁的事务进行回滚。

4. 参考资料

mysql 表锁的概念_MySQL 锁的一些简单概念相关推荐

  1. mysql行锁索引问题_Mysql锁机制--索引失效导致行锁变表锁

    =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不会产生相互影响.不会阻塞, ...

  2. mysql 锁怎么使用_Mysql锁一般使用

    一些很小的项目一般不会特意使用或注意数据锁,其实在事务操作修改与删除时就已经有隐式加锁.一般所有涉及到共享数据都会考虑下数据的原始性问题,保证数据在使用或修改时原始性没有被破坏就需要锁定数据所有权:除 ...

  3. mysql锁简谈_mysql锁简谈

    1.mysql锁, 作用:解决因资源共享而造成的并发问题. 实例:买最好一件衣服X A: X 买: X加锁----->试衣服--下单--付款--打包-.------>X解锁 B: X 买: ...

  4. mysql 锁怎么使用_MySQL锁的用法之行级锁

    行级锁是MySQL中粒度最小的一种锁,他能大大减少数据库操作的冲突.但是粒度越小,实现的成本也越高.MYISAM引擎只支持表级锁,而INNODB引擎能够支持行级锁,下面的内容也是针对INNODB行级锁 ...

  5. mysql行锁怎么读_MySQL锁(三)行锁:幻读是什么?如何解决幻读?

    概述 前面两篇文章介绍了MySQL的全局锁和表级锁,今天就介绍一下MySQL的行锁. MySQL的行锁是各个引擎内部实现的,不是所有的引擎支持行锁,例如MyISAM就不支持行锁. 不支持行锁就意味着在 ...

  6. mysql 锁的类型_mysql锁的分类

    一. 按照对数据操作的粒度分为:表级锁.行级锁.页级锁.间隙锁 MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-level locking) ...

  7. 小米id锁状态查询_MySQL锁机制与事务隔离级别

    01 什么是事务? 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性. 原子性(Atomicity) :事务是一个原子操作单元,其对数据的修改,要么全都执行 ...

  8. mysql表文件被删_mysql表物理文件被误删的解决方法

    前言 1.该方法只介绍了如何救回这个表名(数据不恢复) 如果想要恢复原来数据 直接用extundelete把文件恢复后放回去即可 2.并且是适用于平时没有全备的情况下  如果有全备 直接那全备的frm ...

  9. mysql 锁行语句_mysql 锁表锁行语句分享(MySQL事务处理)

    复制代码 代码如下:mysql_query("set autocommit=0"); $list_one = $db->fetch_first("select * ...

最新文章

  1. 如何在github发布个人网站或开源项目-手把手教您制作并发布个人网站或主页(二)
  2. 支持javascript的博客汇总
  3. 来我们公司面试必问的41道 SpringBoot 面试题,不看亏大了!
  4. excel甘特图制作项目进度管理表
  5. 用计算机弹让我做你的眼睛,童珺 - 让我做你的眼睛 (改编版)-酷歌词...
  6. JTT808、JTT1078、TJSATL主动安全踩坑记录
  7. java 根据助记词导入ETH钱包账户
  8. 码头tsb_码头工人及其内部
  9. ENVI_IDL:批量拼接Modis Swath的逐日数据并输出为Geotiff格式
  10. 北京邮电大学砸彩蛋大作业
  11. 我的编程之路点滴记录(三)
  12. MIPS Linux内核编译构建环境的搭建
  13. 官宣,Google DeepMind 成立
  14. python 三维数据绘制等高线_python密度与等高线绘制,Python,和,轮廓图,Matplotlib,详解...
  15. 【Mac小技巧】如何改变顶部状态栏的颜色
  16. 【超详细】Docker从入门到干活,就看这一篇文章
  17. IEEE754的理解归纳
  18. 什么是MES系统软件,如何用大白话理解MES,公司有了ERP还有必要上MES吗?
  19. 【ACM- OJ】《Oulipo》C++
  20. Squid访问控制实例

热门文章

  1. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (5) - 流水线前端传统译码器
  2. windows下配置mysql允许远程访问
  3. mosquitto常见问题及其解决办法
  4. jedis使用pipline的方法
  5. python国内源很慢_软件下载太慢,为linux,R,python,conda配置国内源,让你快速下载安装大量国外软件...
  6. R循环有两个_循环子群
  7. This is the default error page for nginx that is distributed with EPEL.
  8. Objective-C:NSArray的常见操作
  9. ExtJs十一(ExtJs Mvc图片管理之一)
  10. 杂谈(7)努力就有收获