知识储备:

  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中的各种锁把我搞糊涂啦~

    事务并发访问情况 读-读 情况 并发事务读取相同的数据,并不会对数据造成影响,允许并发读 写-写 情况 多事务并发写写时会发生脏写的情况,不过任何一个事务隔离级别都不允许此情况发生,通过加锁来杜绝脏写 ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行 ...

  3. mysql排他锁和共享锁视频_分享MySQL 中的共享锁和排他锁的用法

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

  4. mysql5.0锁定用户_MySQL系列(五)---总结MySQL中的锁

    MySQL中的锁 目录 概述 MyISAM支持表锁,InnoDB支持表锁和行锁,默认为行锁 表级锁:开销小,加锁快,不会出现死锁.锁定粒度大,发生锁冲突的概率最高,并发量最低 行级锁:开销大,加锁慢, ...

  5. 把MySQL中的各种锁及其原理都画出来

    疫情期间在家工作时,同事使用了 insert into on duplicate key update 语句进行插入去重,但是在测试过程中发生了死锁现象: ERROR 1213 (40001): De ...

  6. mysql中锁原理及for update悲观锁的详解

    mysql 中有多种多样的锁,今天我们具体分享一下: 一.mysql中乐观锁和悲观锁原理及种类: ​        乐观锁并不是数据库自带的,如果需要使用乐观锁,那么需要自己去实现,一般情况下,我们会 ...

  7. 聊聊MySQL中的锁

    原文地址:http://www.linzichen.cn/article/1571531799593484288 在程序开发中,当多个线程并发操作共享数据时,我们需要保证在任何时刻最多只能有一个线程在 ...

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

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

  9. 一文了解 MySQL 中的锁

    1. 数据库并发场景 在高并发场景下,不考虑其他中间件的情况下,数据库会存在以下场景: 读读:不存在任何问题,也不需要并发控制. 读写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不 ...

最新文章

  1. php,http_build_query,乱码
  2. 网站制作时应该如何更合理定位与策划
  3. Opencv载入图片并显示的问题
  4. 【AI呀,我去】科技圈顶流——元宇宙上线,快来揭开它的神秘面纱
  5. kaggle 相关知识汇总(转载+自己整理)
  6. solidity数据位置-memory,storage和calldata
  7. SyntaxError: Non-ASCII character ‘\xe7’ in file car-training.py on line 7, but no encoding declared;
  8. 电子工程师私藏的一个网站
  9. 无盘服务器pnp,锐起无盘PNP有哪些配置类型
  10. 2021中青杯数学建模A题 (论文+代码) 超详细
  11. Android 更改头像(图片)并上传服务器功能Demo详解
  12. 纯CSS实现瀑布流布局
  13. 北京周末去随便走走,体察千百年古城残存的
  14. 如何利用PDF转换器将WPS转换成word
  15. 联想台式计算机光驱启动,联想电脑怎么设置光驱启动【图文】
  16. 谈谈BGA芯片S3C2440的焊接
  17. 机器学习的算法分类、优劣比较和选择
  18. 操作系统单内核和微内核的区别
  19. linux常用命令||
  20. 8B / 10B Encode/Decode详解

热门文章

  1. CNN 图像增强--DSLR-Quality Photos on Mobile Devices with Deep Convolutional Networks
  2. python实现mysql事务_python连接mysql并提交mysql事务示例
  3. 计算机上配置的网卡 实质上是,()计算机上配置的网卡,实质上是_ ___。
  4. SpringBoot监听redis订阅监听和发布订阅
  5. java 导出文件,导出多个文件方案~
  6. Spring Cloud Alibaba 之 服务治理:Nacos 如何实现微服务服务治理
  7. chromium android分析,Chromium Android工程迁移编译过程
  8. python数据类型变量_python的数据类型与变量
  9. 走在技术前沿,今年最火的top5 +Java开源项目
  10. python提交spark_带有python入口点的sparksubmit