数据库死锁

MySQL 加锁处理分析

…衆ロ難τιáo~ 提交于 2019-11-29 08:14:19
http://hedengcheng.com/?p=771 类似的文章:https://www.cnblogs.com/yelbosh/p/5813865.html 1.解释了为什么update insert delete 也属于当前读 2.分9种情况解释了rc rr级别下,当前读在mysql中是如何加锁的 2.1 select no update or share mode 操作在非seariable下均不加锁,采用的是快照读,mysql使用mvcc返回历史数据 2.2 对于当前读,分情况讨论 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因。 注: MySQL是一个支持插件式存储引擎的数据库系统。本文下面的所有介绍,都是基于InnoDB存储引擎,其他引擎的表现,会有较大的区别。 MVCC:Snapshot Read vs Current Read MySQL InnoDB存储引擎

mysql 加锁处理分析

岁酱吖の 提交于 2019-11-29 08:13:53
转载 http://blog.csdn.net/opensure/article/details/46227695 MySQL 加锁处理分析 标签: Database Deadlock Lock MySQL 2015-05-29 11:14 1101人阅读 评论 (0) 收藏 举报 分类: mysql(1) 目录 (?) [+] 1 背景 1 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 2PL:Two-Phase Locking 3 1.4 Isolation Level 4 2 一条简单SQL的加锁实现分析 5 2.1 组合一:id主键+RC 6 2.2 组合二:id唯一索引+RC 6 2.3 组合三:id非唯一索引+RC 7 2.4 组合四:id无索引+RC 8 2.5 组合五:id主键+RR 9 2.6 组合六:id唯一索引+RR 9 2.7 组合七:id非唯一索引+RR 9 2.8 组合八:id无索引+RR 11 2.9 组合九:Serializable 12 3 一条复杂的SQL 12 4 死锁原理与分析 14 5 总结 16 背景 MySQL /InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时

MySQL 加锁处理分析

筅森魡賤 提交于 2019-11-29 08:13:34
链接地址: http://hedengcheng.com/?p=771 1 背景 1 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 2PL:Two-Phase Locking 3 1.4 Isolation Level 4 2 一条简单SQL的加锁实现分析 5 2.1 组合一:id主键+RC 6 2.2 组合二:id唯一索引+RC 6 2.3 组合三:id非唯一索引+RC 7 2.4 组合四:id无索引+RC 8 2.5 组合五:id主键+RR 9 2.6 组合六:id唯一索引+RR 9 2.7 组合七:id非唯一索引+RR 9 2.8 组合八:id无索引+RR 11 2.9 组合九:Serializable 12 3 一条复杂的SQL 12 4 死锁原理与分析 14 5 总结 16 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景

MySQL 加锁处理分析

荒凉一梦 提交于 2019-11-29 08:13:19
MySQL 加锁处理分析 http://hedengcheng.com/?p=771 MySQL 加锁处理分析 1 背景 1 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 2PL:Two-Phase Locking 3 1.4 Isolation Level 4 2 一条简单SQL的加锁实现分析 5 2.1 组合一:id主键+RC 6 2.2 组合二:id唯一索引+RC 6 2.3 组合三:id非唯一索引+RC 7 2.4 组合四:id无索引+RC 8 2.5 组合五:id主键+RR 9 2.6 组合六:id唯一索引+RR 9 2.7 组合七:id非唯一索引+RR 9 2.8 组合八:id无索引+RR 11 2.9 组合九:Serializable 12 3 一条复杂的SQL 12 4 死锁原理与分析 14 5 总结 16 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到 MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思 路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁

Mysql死锁如何排查:insert on duplicate死锁一次排查分析过程

元气小坏坏 提交于 2019-11-29 05:40:11
前言 遇到Mysql死锁问题,我们应该怎么排查分析呢?之前线上出现一个insert on duplicate死锁问题,本文将基于这个死锁问题,分享排查分析过程,希望对大家有帮助。 死锁案发还原 表结构: CREATE TABLE `song_rank` ( `id` int(11) NOT NULL AUTO_INCREMENT, `songId` int(11) NOT NULL, `weight` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `songId_idx` (`songId`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 隔离级别: mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set, 1 warning (0.00 sec) 数据库版本: +------------+ | @@version | +------------+ | 5.7.21-log | +------------+ 1 row in

MySQL中的锁

孤街醉人 提交于 2019-11-29 02:02:16
MySQL中的锁 https://www.cnblogs.com/chenqionghe/p/4845693.html 锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。 MySQL大致可归纳为以下3种锁: 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般 表级锁 MySQL表级锁有两种模式:表共享锁(Table Read Lock)和表独占写锁(Table Write Lock) 对MyISAM的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求 对MyISAM的写操作,则会阻塞其他用户对同一表的读和写操作 MyISAM表的读操作和写操作之间,以及写操作之间是串行的

MySQL死锁

拈花ヽ惹草 提交于 2019-11-28 22:39:40
Reference: https://time.geekbang.org/column/article/117247 死锁产生 行锁的具体实现算法有三种:record lock、gap lock以及next-key lock。 record lock是专门对索引项加锁; gap lock是对索引项之间的间隙加锁; next-key lock则是前面两种的组合,对索引项及其之间的间隙加锁。 只在可重复读或以上隔离级别下的特定操作才会取得gap lock或next-key lock,在Select、Update和Delete时,除了基于唯一索引的查询之外,其它索引查询时都会获取gap lock或next-key lock,即锁住其扫描的范围。主键索引也属于唯一索引,所以主键索引是不会使用gap lock或next-key lock。 在MySQL中,gap lock默认是开启的,即innodb_locks_unsafe_for_binlog参数值是disable的,且MySQL中默认的是RR事务隔离级别。 当执行以下查询SQL时,由于order_no列为非唯一索引,此时又是RR事务隔离级别,所以SELECT的加锁类型为gap lock,这里的gap范围是(4,+∞)。 1 SELECT id FROM demo.order_record where order_no = 4 for

Java高级面试题及答案

你说的曾经没有我的故事 提交于 2019-11-28 16:20:44
List和Set比较,各自的子类比较 对比一: Arraylist与LinkedList的比较 1、ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。 2、因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。 3、LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。 4、因为LinkedList要移动指针,所以查询操作性能比较低。 适用场景分析: 当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。 对比二: ArrayList与Vector的比较 1、Vector的方法都是同步的,是线程安全的,而ArrayList的方法不是,由于线程的同步必然要影响性能。因此,ArrayList的性能比Vector好。 2、当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样。ArrayList就有利于节约内存空间。 3、大多数情况不使用Vector,因为性能不好,但是它支持线程的同步,即某一时刻只有一个线程能够写Vector

挑战10个最难的Java面试题(附答案)【上】

怎甘沉沦 提交于 2019-11-28 14:32:55
这是收集的10个最棘手的Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java 知识,但这些问题都是容易在各种 Java 面试中被问到的,而且包括我的朋友和同事在内的许多程序员都觉得很难回答。 1 为什么等待和通知是在 Object 类而不是 Thread 中声明的? 一个棘手的 Java 问题,如果 Java编程语言不是你设计的,你怎么能回答这个问题呢。Java编程的常识和深入了解有助于回答这种棘手的 Java 核心方面的面试问题。 为什么 wait,notify 和 notifyAll 是在 Object 类中定义的而不是在 Thread 类中定义 这是有名的 Java 面试问题,招2~4年经验的到高级 Java 开发人员面试都可能碰到。这个问题的好在它能反映了面试者对等待通知机制的了解, 以及他对此主题的理解是否明确。就像为什么 Java 中不支持多继承或者为什么 String 在 Java 中是 final 的问题一样,这个问题也可能有多个答案。 为什么在 Object 类中定义 wait 和 notify 方法,每个人都能说出一些理由。从我的面试经验来看, wait 和 nofity 仍然是大多数Java 程序员最困惑的,特别是2到3年的开发人员

重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现

余生颓废 提交于 2019-11-28 10:37:17
说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同。 三类常见引擎: MyIsam :不支持事务,不支持外键,所以访问速度快。锁机制是表锁,支持全文索引 InnoDB :支持事务、支持外键,所以对比MyISAM,InnoDB的处理效率差一些,并要占更多的磁盘空间保留数据和索引。锁机制是行锁,不支持全文索引 Memory:数据是存放在内存中的,默认哈希索引,非常适合存储临时数据,服务器关闭后,数据会丢失掉。 如何选择存储引擎: MyISAM:应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高。 InnoDB:用于事务处理应用程序,支持外键,如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性。更新删除等频繁(InnoDB可以有效的降低由于删除和更新导致的锁定),对于数据准确性要求比较高的,此引擎适合。 Memory:通常用于更新不太频繁的小表,用以快速得到访问结果。 Mysql中的锁 如果熟悉多线程,那么对锁肯定是有概念的,锁是计算机协调多个进程或线程对某一资源并发访问的机制。 Mysql中的锁分为表锁和行锁: 顾名思义,表锁就是锁住一张表,而行锁就是锁住一行。 表锁的特点:开销小,不会产生死锁,发生锁冲突的概率高,并且并发度低。 行锁的特点:开销大,会产生死锁,发生锁冲突的概率低,并发度高。