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 ...
随机推荐
- Linux文件系统操作
1:查看磁盘使用情况 df [-选项] 目录名 2:查看目录下文件大小 du 目录名称 3:实体链接 创建inode产生一个新文件名,链接到一个已有的文件. 限制:不能垮文件系统进行实体链接:不能链接 ...
- java.lang.AbstractStringBuilder.enlargeBuffer
04-18 10:22:08.585 3653-3653/com.tongyan.lanzhou.rv I/dalvikvm: "main" prio=5 tid=1 RUNNAB ...
- Java之创建对象>7.Avoid finalizers
1.Finalizers are unpredictable, often dangerous, and generally unnecessary. 2.never do anything time ...
- NDT(Normal Distributions Transform)算法原理与公式推导
正态分布变换(NDT)算法是一个配准算法,它应用于三维点的统计模型,使用标准最优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快.下面的公式推导 ...
- vi编辑器的常用命令
游标控制 h 游标向左移 j 游标向下移 k 游标向上移 l (or spacebar) 游标向右移 w 向前移动一个单词 b 向后移动一个单词 e 向前移动一个单词,且游标指向单词的末尾 ( 移到当 ...
- checkbox 多选框 :jquery之全选、全不选、反选
javascriptjqueryselectAll [html] view plaincopy <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...
- VS编译 x64版本zlib库
编译的过程倒也不是很难.我把编译的源码和脚本及说明都放在gitee上了. 详细的可以见这里 https://gitee.com/solym/zlib-1.2.11.git 可以参考这些文章 win10 ...
- 批处理转exe工具(Quick Batch File Compiler )|bat格式化exe
看到的,就是回忆.历史总是那么漫不经心,走完一生.留下可以记忆的脚本.... 对于window编写的bat脚本,想加密吗? 你所想的,前辈们基本上都有产出成果.所以在这个开源.共享.进步的互联网时代. ...
- SpringBoot集成MyBatis的分页插件PageHelper
俗话说:好
- GNU Linux系统变量(sysctl配置命令)综合使用
查看全部kernel变量的值 sysctl -a 怎样查看一个系统变量的值 1).cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 2).s ...