知识储备:

  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. iOS -多字体混合

    label 加下划线 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 300, 100)];    label.b ...

  2. hasOwnProperty方法的使用

    JavaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性. 使用方法: object.hasOwnProperty(proName)其中参数obj ...

  3. iPhone 和Android应用,特殊的链接:打电话,短信,email;

    http://ice-k.iteye.com/blog/1426526 下面的这篇文章主要是说,网页中的链接如何写,可以激活电话的功能. 例如,页面中展示的是一个电话号码,当用户在手机浏览器里面点击这 ...

  4. cf C. Bombs

    http://codeforces.com/contest/350/problem/C 对n个点按曼哈顿距离排序. #include <cstdio> #include <cstri ...

  5. DJANGO的HTTPRESPONSE流式输出

    在项目当中遇到的问题,网上有样例代码,但都不行,后来,发现在了1.5版本之后,新的STREAMHTTPRESPONSE对象, 搞定. from django.http import HttpRespo ...

  6. html 表单初步学习

    <html> <head> <title> 静态页面</title> </head> <body> 这是一个静态页面<br ...

  7. 【转】Linux系统调用列表

    一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtablesize 进程所能打开的最 ...

  8. JS~Boxy和JS模版实现一个标准的消息提示框

    面向对象的封装 面向对象一个入最重要的特性就是“封装”,将一些没有必要公开的方法和属性以特定的方式进行组装,使它对外只公开一个接口,外界在调用它时,不需要关注它实现的细节,而只要关注它的方法签名即可, ...

  9. 01串(dp)

    01串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个, ...

  10. [Firmware Warn]: GHES: Failed to read error status block address for hardware error source

    Firmware Warn 问题描述: 系统版本:Ubuntu 12.04 LTS. 系统启动后dmesg打印大量Firmware Warn告警信息到syslog文件中.信息如下: [Firmware ...