MySQL有三种锁的级别:页级、表级、行级。
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level
locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
MySQL这3种锁的特性可大致归纳如下:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

示例1:

-- 按行获取行锁
-- 获取主键的共享锁
insert into logging_exceptionlog_history_id_2 SELECT * from logging_exceptionlog_history_id;
-- 获取主键的互斥锁
delete from logging_exceptionlog_history_id where id > 100 and id < 1000;

show engine innodb status;   查看innodb引擎状态,可查看最近的死锁情况

示例2:

表t1

CREATE TABLE `t1` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(64) DEFAULT NULL,
  `Age` int(11) DEFAULT NULL,
  `PostTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

会话1
-- 全局的自动提交设为0,即不自动提交,然后另开一个会话查询autocommit状态,当前会话可能还没起作用
set GLOBAL autocommit = 0;

会话2

-- 另开一个会话查询autocommit状态

show VARIABLES like '%autocommit%';

-- 插入一条记录
INSERT into t1(Name, Age) values('xxx', 23);

会话3

show VARIABLES like '%autocommit%';
-- 使用共享锁查询表,注意一定要加上 lock in share mode,否则不会出现死锁
select * from t1 lock in share mode;

查看

select * from INNODB_LOCK_WAITS;

select * from INNODB_LOCKS;

select * from INNODB_TRX;

连接查询, 只需要使用这个sql即可查询上述三表的信息

select a.requesting_trx_id, c.lock_mode as wait_lock_mode,
c.lock_type as wait_lock_type, c.lock_table as wait_lock_table,
c.lock_index as wait_lock_index, c.lock_data as wait_lock_data,
e.trx_state as wait_trx_state, e.trx_query as wait_trx_query,
a.blocking_trx_id,b.lock_mode as block_lock_mode, b.lock_type as block_lock_type,
b.lock_table as block_lock_table, b.lock_index as block_lock_index, b.lock_data as block_lock_data,
d.trx_state as block_trx_state, d.trx_query as block_trx_query
from information_schema.INNODB_LOCK_WAITS a
     INNER JOIN information_schema.INNODB_LOCKS b on a.blocking_lock_id = b.lock_id
     INNER JOIN information_schema.INNODB_LOCKS c on a.requested_lock_id = c.lock_id
     INNER JOIN information_schema.INNODB_TRX d on a.blocking_trx_id = d.trx_id
     INNER JOIN information_schema.INNODB_TRX e on a.requesting_trx_id = e.trx_id

mysql死锁示例的更多相关文章

  1. Mysql 死锁问题

    Innodb锁系统(4) Insert/Delete 锁处理及死锁示例分析 http://mysqllover.com/?p=431 关于innodb死锁 http://afei2.sinaapp.c ...

  2. 手把手教你分析解决MySQL死锁问题

    在生产环境中如果出现MySQL死锁问题该如何排查和解决呢,本文将模拟真实死锁场景进行排查,最后总结下实际开发中如何尽量避免死锁发生. 一.准备好相关数据和环境 当前自己的数据版本是8.0.22 mys ...

  3. 记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理

    昨晚我正在床上睡得着着的,突然来了一条短信. 啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志. 能清楚看到是这条insert语句发生了死锁. MySQL如果检测到两个事务发生了死锁,会回滚 ...

  4. MySQL 死锁问题分析

    转载: MySQL 死锁问题分析 线上某服务时不时报出如下异常(大约一天二十多次):"Deadlock found when trying to get lock;". Oh, M ...

  5. 为什么MySQL死锁检测会严重降低TPS

    在大量的客户端,更新数据表的同一行时,会造成数据库的吞吐量大幅降低. 很多数据库的前辈和同行分别通过实验和源码的方法,定位到了罪魁祸首----MySQL死锁检测 实验方式:http://blog.cs ...

  6. JAVA使用jdbc连接MYSQL简单示例

    以下展示的为JAVA使用jdbc连接MYSQL简单示例: import java.sql.DriverManager; import java.sql.ResultSet; import java.s ...

  7. Mysql死锁问题解决方式 & 聚簇索引、隔离级别等知识

    参考了这篇文章:http://www.cnblogs.com/LBSer/p/5183300.html  <mysql死锁问题分析> 写的不错. 如果Mysql死锁,会报出: 1.1 死锁 ...

  8. 一次MySQL死锁问题解决

    一次MySQL死锁问题解决 一.环境 CentOS, MySQL 5.6.21-70, JPA 问题场景:系统有定时批量更新数据状态操作,每次更新上千条记录,表中总记录数约为500W左右. 二.错误日 ...

  9. MySQL死锁案例分析与解决方案

    MySQL死锁案例分析与解决方案 现象: 数据库查询: SQL语句分析:  mysql. 并发delete同一行记录,偶发死锁.   delete from x_table where id=?   ...

随机推荐

  1. makefile 中定义宏位置需要注意一下

    CUR_DIR = $(shell pwd) CFLAGS = -g -Wall GCC = gcc GXX = g++ TARGET = exe.out SRC_FILES += $(shell f ...

  2. (笔记)angular material 选项卡用法

  3. Spring与Quartz的整合实现定时任务调度

    摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我 ...

  4. SQL Server 2008 R2 找不到 Install SQL Server Profiler 找不到 事件探查器 解决

    摘自: http://blog.csdn.net/yuxuac/article/details/8992893 SQL Server 2008 R2 Express Edition - Install ...

  5. OpenLDAP 安装及配置 笔记

    首先下载 OpenLdap(Ldap服务器) 和 LdapAdmin(客户端) 两个软件 OpenLDAPforWindows_2.4.39.part1.rar OpenLDAPforWindows_ ...

  6. sotower1.5报错 -Xlint:unchecked

    新建sotower项目 控制台启动正常,登录页面报错 StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw except ...

  7. docker开发_在basic image的基础上创建自定义的image

    方法一:docker commit 1. 跑一个basic image,docker新建了一个容器 root@ubuntu:/home/thm/docker/test# docker run -i - ...

  8. POJ C程序设计进阶 编程题#4:Tomorrow never knows?

    来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 甲壳虫的<A day ...

  9. Webservice SOAP传输序列化总结 以及webservice之序列化以及反序列化实例

    一.所有Webservice中传递的对象都必须能够序列化,这个是作为在网络之间传输的必要条件.XML WebService和SOAP标准支持的数据类型如下: 1.基本数据类型. 标准类型,如:int ...

  10. webservice简介以及简单使用

    本文主要是简单的介绍webservice是什么.webservice的由来.webservice的作用,以及后面会介绍webservice的使用. webservice是什么? 目前,Web serv ...