MySQL InnoDB 锁表与锁行

由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。

举个例子: 假设有个表单products ,里面有id跟name二个栏位,id是主键。

例1: (明确指定主键,并且有此笔资料,row lock)

SELECT * FROM products WHERE id='3' FOR UPDATE;
SELECT * FROM products WHERE id='3' and type=1 FOR UPDATE;

例2: (明确指定主键,若查无此笔资料,无lock)

SELECT * FROM products WHERE id='-1' FOR UPDATE;

例3: (无主键,table lock)

SELECT * FROM products WHERE name='Mouse' FOR UPDATE;

例4: (主键不明确,table lock)

SELECT * FROM products WHERE id<>'3' FOR UPDATE;

例5: (主键不明确,table lock)

SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;

注:

1. FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。
2. 要测试锁定的状况,可以利用MySQL的Command Mode ,开二个视窗来做测试。

在MySql 5.0中测试确实是这样的

另外:MyAsim 只支持表级锁,InnerDB支持行级锁
添加了(行级锁/表级锁)锁的数据不能被其它事务再锁定,也不被其它事务修改(修改、删除)
是表级锁时,不管是否查询到记录,都会锁定表

此外,如果A与B都对表id进行查询但查询不到记录,则A与B在查询上不会进行row锁,但A与B都会获取排它锁,此时A再插入一条记录的话则会因为B已经有锁而处于等待中,此时B再插入一条同样的数据则会抛出Deadlock found when trying to get lock; try restarting transaction然后释放锁,此时A就获得了锁而插入成功

Innodb中的行锁与表锁

前面提到过,在Innodb引擎中既支持行锁也支持表锁,那么什么时候会锁住整张表,什么时候或只锁住一行呢?

InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。

行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁。行级锁的缺点是:由于需要请求大量的锁资源,所以速度慢,内存消耗大。

行级锁与死锁

MyISAM中是不会产生死锁的,因为MyISAM总是一次性获得所需的全部锁,要么全部满足,要么全部等待。而在InnoDB中,锁是逐步获得的,就造成了死锁的可能。

在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。 在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking。

当两个事务同时执行,一个锁住了主键索引在等待其他相关索引,一个锁定了非主键索引,在等待主键索引。这样就会发生死锁。

发生死锁后,InnoDB一般都可以检测到,并使一个事务释放锁回退,另一个获取锁完成事务。

有多种方法可以避免死锁,这里只介绍常见的三种,具体如下

1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

关于for update 等操作:https://www.cnblogs.com/nxzblogs/p/11639807.html

MySQL行锁 表锁理解相关推荐

  1. mysql innodb 全表锁,Mysql InnoDB行锁及表锁分享

    一. 背景知识 二. 步入正题:表锁和行锁 1.1. 表锁 vs 行锁 在 MySQL 中锁的种类有很多,但是最基本的还是表锁和行锁:表锁指的是对一整张表加锁,一般是 DDL 处理时使用,也可以自己在 ...

  2. mysql怎么加全局锁_MySQL锁机制/管理(并发锁,行锁,表锁,预加锁,全局锁等等)

    MySQL实验室 1.?MySQL 中并发和隔离控制机制 Meta-data元数据锁:在table cache缓存里实现的,为DDL(Data Definition Language)提供隔离操作.一 ...

  3. MySQL - 行锁 表锁 乐观锁 悲观锁 读锁 写锁

    MySQL - 行锁 表锁 乐观锁 悲观锁 读锁 写锁 锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足.在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(I ...

  4. MySQL中的表锁行锁共享锁很难吗?看了本文就清楚了哦

      MySQL数据库中的锁还是非常重要的,本文重点给大家详细的来介绍下MySQL数据中的各种锁. 一.表锁和行锁 1.表锁 表锁的优势:开销小:加锁快:无死锁 表锁的劣势:锁粒度大,发生锁冲突的概率高 ...

  5. mysql BDB支持表锁吗_mysql 表锁问题

    本文转自:http://www.cnblogs.com/itdragon/p/8194622.html MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整 ...

  6. 大话:行锁 间隙锁 表锁 临键锁

    行锁 临键锁 间隙锁都是mysql里面innoDB引擎下去解决事务隔离性的一系列排他锁. 目录 行锁 ​编辑 间隙锁 表锁 临键锁 行锁 对主键或唯一索引加锁时候,mysql默认会对这一行数据默认加行 ...

  7. [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)

    不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的.因为数据库隐式帮我们 ...

  8. mysql进阶: mysql中的锁(全局锁/表锁/行锁/间隙锁/临键锁/共享锁/排他锁)

    锁在生活中处处可见,门锁,手机锁等等. 锁存在的意义是保护自己的东西不被别人偷走/修改. 在mysql中锁的意义也是一样,是为了保护自己的数据不被别人进行修改,从而导致出现脏读,幻读等问题.在学习锁的 ...

  9. MySQL的锁(表锁与行锁)

    1.锁 为什么需要锁? 在实际中,比如在淘票票抢电影票,A用户和B用户都想要要2排2座,那么它们必然只有一个人能抢到.在这个过程中,使用锁可以对有效的资源在并发的环境下进行保护,解决隔离和并发的矛盾. ...

最新文章

  1. CF786B Legacy(线段树优化建边模板 + 最短路)
  2. 分分钟教会你使用HTML写Web页面
  3. [转]七大.NET开源框架
  4. ​rsync应用拓展多模块同步13
  5. iOS 毛玻璃效果的实现方法
  6. 用与非门设计血型配对电路_电路板中与非门集成电路的控制原理
  7. python+selenium配置Edge浏览器
  8. golang生成c-shared so供c语言或者golang调用到例子
  9. linux图片处理工具GraphicsMagick安装使用
  10. el表达式 循环_EL表达式+JSTL+Ajax 047
  11. 项目建设做好服务器,我院数字化建设项目(一期)服务器系统切换工作顺利完成...
  12. Oracle中的SAVEPOINT
  13. token的作用_说一说Coin和Token有什么不同
  14. 安装Docker Desktop报错WSL 2 installation is incomplete
  15. /*CS5460_Note_1*/
  16. 强监管焕新外卖行业,美团、饿了么如何应对?
  17. 京东手机评论分析(一):词云
  18. 我最欣赏的一句话:天道酬勤
  19. 从目标检测到小目标检测
  20. 智能人物画像综合分析系统——Day15

热门文章

  1. 重拾Javascript(四) 运动 图片的淡入淡出
  2. WPF4.5 Cockbook - Chapter8(Style, Triggers and Control Template)
  3. 诗与远方:无题(二十九)
  4. sorted是python的内置函数吗_Python中的内置sorted()函数
  5. 有关凸集的证明例题_第1章引言题解1. 用定义验证下列各集合是凸集: (1) S={(X1 ......
  6. Idea加快开发的10个技巧
  7. python版trace命令显示归属地
  8. 生产环境使用elasticsearch遇到的一些问题以及解决方法(不断更新)
  9. CentOS安装Redis、PHPredis扩展及Redis配置文件详解
  10. ANSI,Unicode,UTF-8网页编码的区别【转】