MySQL 两个死锁样例
【引子】
从事MySQL-DBA这一行也有些年头了,想对新人说,在分析死锁问题时应该还要考虑到有一个叫请求队列的“概念”。之所以
在这里提这个不是因为新手不知道,而是有时候会自然而然的想不到。
不信的话,我下面要说的这个例子每个dba都知道要排队
session A
creat table t(x int primary key);
insert into t(x) values(1); start transaction;
update t set x=2 where x=1;
session B
update t set x=3 where x=1;
由于session A持有着x=1那一行的“X”锁,所以当session B要去更新x=1这一行时它就只能是等待了,此时如果有session C它也要去更新
x=1的行,那么session C的获取锁的请求就要排在session B的后面。
【样例一】
session A
create table t(id int primary key); insert into t(id) values(1); start transaction; select * from t where id=1 for share;
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
session B
update t set id=1 where id=1;
session C
update t set id=1 where id=1;
由于session A已经持有id=1这一行记录的“S”锁,所以session B 和session C都要等待,还要知道另一件事就是session B的等待请求排在session C
前面,也就是说要想session C能得到锁,它要等session B用完了之后才能拿到,然而session B要等session A用完之后它才可能拿到。
有没有想到一个问题,如果这个上时候session A再去请求id=1这一行上的“X”锁,然而这把锁永远都不可能得到了,原因是session A的“X”锁请求
排在了session C的后面,seesion C要能得到锁的关键是session 释放“S”让session B得以进行;但是session A还没有到释放“S”锁的阶段
所以死锁就产生了。
看下面的操作
session A
update t set id=1 where id=1;
Query OK, 0 rows affected (0.01 sec)
Rows matched: 1 Changed: 0 Warnings: 0
session B
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
session C
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
可以看到为了解除死锁mysql 把session B 和session C 给干掉了
未完 ... ...
----
MySQL 两个死锁样例的更多相关文章
- JDBC连接MySQL数据库及演示样例
JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...
- Sakila——MySQL样例数据库解析(已经迁移)
一.Introduction Sakila可以作为数据库设计的参考,也可作为实验数据.我是用作数据仓库和ODI学习的实验数据. The Sakila sample database was devel ...
- 《MySQL必知必会》学习笔记——附录B 样例表
附录B 样例表 本附录简要描述本书中所用的表及它们的用途. 编写SQL语句需要对基础数据库的设计有良好的理解.不知道什么信息存储在什么表中,表之间如何关联以及行内数据如何分解,是不可能编写出高效的SQ ...
- mysql样例数据库employees
Oracle和sqlserver都有基于员工信息的样例数据库,同样mysql上也是有的. 给出一个连接地址https://github.com/datacharmer/test_db. 下载后直接调用 ...
- docker-compose.yml样例(mysql主从+mycat读写分离)
Docker-compose.yml文件示例 1.mysql主从复制的docker-compose.yml文件 # cat docker-compose.yml version: '2' # 这个ve ...
- myloader恢复mysql数据库演示样例
mydumper是针对mysql数据库备份的一个轻量级第三方的开源工具.备份方式为逻辑备份.它支持多线程.备份速度远高于原生态的mysqldump以及众多优异特性.与其相配套的恢复工具则是mylo ...
- MySql的事务操作与演示样例
事务就是一个逻辑工作单元的一系列步骤. 事务是用来保证数据操作的安全性 事务的特征: Atomicity(原子性) Consistency(稳定性,一致性) Isolation(隔离性) Durabi ...
- Linux下用OTL操作MySql(包含自己封装的类库及演示样例代码下载)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ClamReason/article/details/23971805 首先重点推荐介绍otl介绍及使 ...
- Jmeter 样例 之 JDBC请求-操作MySql数据库
准备: 1.MySql的驱动jar包:mysql-connector-java-5.1.28.jar, 2.jmeter安装目录中修改编码格式:\bin\jmeter.properties :sa ...
随机推荐
- 命令行能运行,但是在crontab不能正常运行的问题
今天配置了一个crontab,但是怎么也不能执行,原因是环境变量的问题,记录一下. 解决问题的办法,在shell脚本添加: ################## . /etc/profile . ~/ ...
- 转:nginx模块开发——handler(一)
handler模块简介 相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识.基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-ba ...
- HDU 3001 Travelling (三进制状态压缩 DP)
题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...
- Searching for equivalent of FileNotFoundError in Python 2
I created a class named Options. It works fine but not not with Python 2. And I want it to work on b ...
- 如何查看页面是否开启gzip压缩
F12 选择Network 表头右键: 如果开启了gzip则显示gzip,没有则是空. 上图是百度首页,显示已经进行gzip压缩.
- go1.8之安装配置
说明: 之前学习过go语言(大概是0.9版本),后来更新太快,也没怎么使用,就荒废掉了,今年有项目需要用go开发,重新捡起. 这是我在学习go语言过程中整理的内容,这里记录下,也方便我以后查阅. 操作 ...
- Java多线程之Semaphore信号量
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6557874.html 学过操作系统的对 信号量 这个词应该不陌生,它是用来进行进程间通信,控制对 临界区 ...
- openerp学习笔记 视图继承(tree、form、search)
支持的视图类型:form.tree.search ... 支持的定位方法: <notebook position="inside"> ...
- Android开发之使用HttpURLConnection进行POST请求
一.前提准备 在开始实际编码之前,我们有必要先了解下将会用的类以及方法,进行一个大体的了解. 1.URL类 这个类主要的功能是定位到要获取资源的网址以及打开连接.比如下面的代码: URL realur ...
- DXL之通过程序修改Domino的设计
Domino R6中,可以将设计元素导出并产生一个DXL(Domino XML)文档,导出以后,我们可以通过程序代码将DXL文档进行修改,再将修改后的代码导入到Domino数据库.这种方式可以修改设计 ...