知识储备:

  1、官方文档上说mysql是支持非锁定读的;这个功能是这样实现的,如果事务a 要对行的数据进行更新的话,那么事务a要得到行的x锁,并把这一行

     之前的样子记录在undo log里面,这样一来如果a 事务rollback 了就可以通过undo log 来恢复到之前的样子;说白了非锁定的一致性读就是读的

     行的undo log 中的内容,所以这货根本就不用上锁。

  2、在mysql中事务与锁的关系:

     1、事务开始之后申请锁。

     2、得到锁之后才进行相关的操作,事务提交或回滚之后才会去释放申请到的锁。

  3、如果想要select 语句也加上s锁可以在select 后面加上lock in share mode 子句。

  4、mysql支持意向锁、意向锁是在表级别上的;

  

  5、innodb 对锁的分配方式:

     1、innodb 的锁是需要用到的时候才会去分配,并是一次性要把事务要用到的锁分配完成后才去执行事务。

     2、对锁的申请请求是放在一个队列当中的,请申请的先得到。

例子:一个lock in share mode 引起的死锁问题:

  1、准备环境:

create database tempdb;
use tempdb;
create table t(x int);
insert into t(x) values(1);

  2、事务一执行如下语句:

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec) mysql> select * from t where x=1 lock in share mode;
+------+
| x |
+------+
| 1 |
+------+
1 row in set (0.00 sec)

  3、事务二执行如下语句:

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec) mysql> delete from t where x=1;

  4、接着事务一又执行如下语句:

mysql> delete from t where x=1;

  5、最后mysql 监控到死锁

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

原因分析:

  1、事务一先是得到了x=1 这一行上的s 锁;

  2、事务二要去申请x=1    这一行上的x锁,由于事务一已经得到了s锁,所以它要等待事务一释放s锁。

  3、事务一又想去申请x=1  这一行上的x锁,由于事务二的申请在事务一的前面发起,所以它要等待事务二完成后才能得到。

  

  由以上分析可知,事务一,事务二产生了相互等待;进而死锁产生。

mysql中的意向锁IS,IX的更多相关文章

  1. [数据库事务与锁]详解六: MySQL中的共享锁与排他锁

    注明: 本文转载自http://www.hollischuang.com/archives/923 在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大 ...

  2. MySQL系列(五)---总结MySQL中的锁

    MySQL中的锁 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 MySQL系列(三):索引 MySQL系列(四):引擎 概述 MyISAM支持表锁,InnoDB支持 ...

  3. 【数据库】MySQL中的共享锁与排他锁

    转载:http://www.hollischuang.com/archives/923 在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库 ...

  4. 【转】MySQL中的共享锁与排他锁

    在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念.使用方式及 ...

  5. Mysql中的锁机制

    原文:http://blog.csdn.net/soonfly/article/details/70238902 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如 ...

  6. 转 MySQL中的共享锁与排他锁

    原文链接在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念.使 ...

  7. MySQL中的共享锁与排他锁

    MySQL中的共享锁与排他锁 在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共 ...

  8. MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

    原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是 ...

  9. 谈谈MySQL中的锁

    谈谈MySQL中的锁 锁的定义 ​ 在生活中锁的例子就非常多了,所以应该很容易理解锁的含义.在计算机领域,可以这样来概述,锁是计算机协调多个进行进程并发访问某一资源的机制. ​ 在数据库中,锁也是一个 ...

随机推荐

  1. cocos2d-x特效之CCControlPotentiometer

    在test示例下面,有一个关于此功能的代码,实现的效果如下: 通过拉动可旋转的按钮,从而改变所代表的值,这个效果的确是很棒的,但,和我的需求有一些差别,先贴上我实现的效果吧               ...

  2. !!!!OpenWrt系列教程汇总

    OpenWrt FAQ https://dev.openwrt.org.cn/wiki/faqs OpenWrt编译教程 完全新手教程:openwrt编译全过程(sse) 直接编译出带中文的openw ...

  3. 【转】Linux中history历史命令使用方法详解

    原文网址:http://os.51cto.com/art/201205/335040.htm 当你在玩Linux的时候,如果你经常使用命令行来控制你的Linux系统,那么有效地使用命令历史机制将会使效 ...

  4. Google的Protocol Buffer格式分析

    [转]转自:序列化笔记之一:Google的Protocol Buffer格式分析 从公开介绍来看,ProtocolBuffer(PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.作 ...

  5. Increasing/ Decreasing Stack

    对于此类问题: 对于元素nums[i],找出往左/右走第一个比它小/大的数字 我们常常用递增栈/递减栈实现. 递增栈实现第一个比它小 递减栈实现第一个比它大 Example: 2 1 5 6 2 3 ...

  6. Linux Shell脚本编程--nc命令使用详解

    linux nc命令使用详解     功能说明:功能强大的网络工具 语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>] ...

  7. 【转】P2P之UDP穿透NAT的原理与实现(附源代码)

    作者:shootingstars (有容乃大,无欲则刚)  日期:2004-5-25 出处:P2P中国(PPcn.net) P2P 之 UDP穿透NAT的原理与实现(附源代码)原创:shootings ...

  8. java与.net比较学习系列(3) 基本数据类型和类型转换

    在Java中,数据类型分为两类,一类是基本数据类型,另外一类是引用类型. 而在C#中,数据类型分为三类,分别是基元类型,值类型和引用类型.其中基元类型是.net framework框架中预定义的类型, ...

  9. Android资源--颜色RGB值以及名称及样图

      颜  色    RGB值 英文名 中文名   #FFB6C1 LightPink 浅粉红   #FFC0CB Pink 粉红   #DC143C Crimson 深红/猩红   #FFF0F5 L ...

  10. UVA 536 (13.08.17)

     Tree Recovery  Little Valentine liked playing with binary trees very much. Her favoritegame was con ...