mysql锁与性能_MySQL性能优化--锁(概念)

《 MySQL性能优化--锁》首发牧码人博客转发请加此提示

MySQL基本概念--锁

介绍下对于MySQL锁机制的理解

从基本概念开始:

共享锁

共享锁的代号是S,是Share的缩写,共享锁的锁粒度是行或者元组(多个行)。一个事务获取了共享锁之后,可以对锁定范围内的数据执行读操作。

排它锁

排它锁的代号是X,是eXclusive的缩写,排它锁的粒度与共享锁相同,也是行或者元组。一个事务获取了排它锁之后,可以对锁定范围内的数据执行写操作。

假设有两个事务t1和t2

如果事务t1获取了一个元组的共享锁,事务t2还可以立即获取这个元组的共享锁,但不能立即获取这个元组的排它锁(必须等到t1释放共享锁之后)。

如果事务t1获取了一个元组的排它锁,事务t2不能立即获取这个元组的共享锁,也不能立即获取这个元组的排它锁(必须等到t1释放排它锁之后)

意向锁

意向锁是一种表锁,锁定的粒度是整张表,分为意向共享锁(IS)和意向排它锁(IX)两类。意向共享锁表示一个事务有意对数据上共享锁或者排它锁。“有意”这两个字表达的意思比较微妙,说的明白点就是指事务想干这个事但还没真去干。举例说明下意向共享锁,比如一个事务t执行了这样一个语句:select * from table lock in share model ,如果这个语句执行成功,就对表table上了一个意向共享锁。lock in share model就是说事务t1在接下来要执行的语句中要获取S锁。如果t1的select * from table lock in share model执行成功,那么接下来t1应该可以畅通无阻的去执行只需要共享锁的语句了。意向排它锁的含义同理可知,上例中要获取意向排它锁,可以使用select * from table for update****。

lock in share model 和 for update这两个东西在数据率理论中还有个学名叫悲观锁,与悲观锁相对的当然还有乐观锁。大家可以看到各种锁都是成双成对出现的。关于悲观锁和乐观锁的问题暂且不表,下文再来详述。

锁的互斥与兼容关系

锁和锁之间的关系,要么是相容的,要么是互斥的。

锁a和锁b相容是指:操作同样一组数据时,如果事务t1获取了锁a,另一个事务t2还可以获取锁b;

锁a和锁b互斥是指:操作同样一组数据时,如果事务t1获取了锁a,另一个事务t2在t1释放锁a之前无法获取锁b。

上面提到的共享锁、排它锁、意向共享锁、意向排它锁相互之前都是有兼容/互斥关系的,可以用一个兼容性矩阵表示(y表示兼容,n表示不兼容):

X S IX IS

X n n n n

S n y n y

IX n n y y

IS n y y y

兼容性矩阵为什么是这个样子的?

X和S的相互关系在上文中解释过了,IX和IS的相互关系全部是兼容,这也很好理解,因为它们都只是“有意”,还处于YY阶段,没有真干,所以是可以兼容的;

剩下的就是X和IX,X和IS, S和IX, S和IS的关系了,我们可以由X和S的关系推导出这四组关系。

简单的说:X和IX的=X和X的关系。为什么呢?因为事务在获取IX锁后,接下来就有权利获取X锁。如果X和IX兼容的话,就会出现两个事务都获取了X锁的情况,这与我们已知的X与X互斥是矛盾的,所以X与IX只能是互斥关系。其余的三组关系同理,可用同样的方式推导出来。

对于 UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁; 事务可以通过显式给记录集加共享锁或排他锁。

其它:

一致性非阻塞读

select... lock in share mode和select ... for update的区别

索引记录锁

间隙锁

后码锁

各种语句对应的锁类型

在有索引的情况下是以后码锁为基础的行级锁,在固定索引键查找的情况下是索引记录锁,在没有可用索引的情况下上升到表锁

有索引的情况:

select ... from 一致性非阻塞读,不上锁。在serializable隔离级别下例外,在这个隔离级别下上共享后码锁

select ... from ... lock in share mode 共享后码锁

select ... from ... for update 排它后码锁

update .... where 排它后码锁

delete from .... where 排它后码锁

insert ... 排它索引记录锁,如果发生键值唯一性冲突则转成共享锁

insert ... on duplicate key update ,一直都是排它锁

replace ... 一直都是排它锁

注意:本文归作者所有,未经作者允许,不得转载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]使用C#开发ActiveX控件

前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力。通常ActiveX控件都是用C或VB语言开发,本文介绍另一…

用Java测试多线程代码

测试多线程代码是一个艰巨的挑战。 尝试测试并发性时获得的第一个建议是尽可能地在代码中隔离并发问题。 这是一般的设计建议,但在这种情况下甚至更重要。 确保首先正确地对并发构造所包装的逻辑进行单元测试。 否则,您可能会花费很长时间尝试找出一个并…

php pdo mysql query_PHP+MYSQL中使用PDO的query方法

一 代码class"php">PDO连接MySQL数据库IDPDO数据库时间$dbmsmysql; //数据库类型 ,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数$hostlocalhost; //数据库主机名$dbNamedb_database15; //使用的数据库$use…

pat 团体赛练习题集 L2-008. 最长对称子串

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。 输入格式: 输入在一行中给出长度不超过1000的…

在Apache Camel中使用Spring数据

Spring Data通过创建智能的DAO节省了很多时间,您基本上不需要编写任何代码就可以免费获得DAO。 它基本上遵循Eric Evans的DDD书中的“ 存储库模式 ” ,并将实体视为集合。 它有一个很好的约定,允许您为复杂查询指定条件,甚至可以将…

python协程池操作mysql_python_协程方式操作数据库

#!/usr/bin/python3# -*- coding: utf-8 -*-import requestsimport geventimport pymysqlfrom gevent import monkey# 堵塞标记monkey.patch_all()class SqlSave(object):"""协程方式写入数据库"""def __init__(self):SQL_DBA {‘host‘: ‘loc…

bootstrap在ie8下,兼容媒体查询

最近使用bootstrap做网站的时候发现&#xff0c;在ie8下的媒体查询一直失效&#xff1a; 后来解决了&#xff0c;做如下记录&#xff1a; 1、必须运行在服务器下 2、hack 条件语法&#xff0c;如下&#xff1a; <!--[if lte ie 9]><script src"js/html5shiv.min.…

java 冒号 正则表达式_Java正则表达式问号冒号的使用

在Java和Javascript中正则表达式字符串前面加上?:表示非捕获型匹配&#xff0c;否则就是捕获型匹配。捕获型括号会将匹配到的内容捕获到一些变量里&#xff0c;这些变量按照捕获型括号的左括号为顺序从1开始编号。为了避免括号太多使编号混乱&#xff0c;也为了避免无用的捕获…

Hibernate中的一对多XML映射

一对多关系指出一个实体的单个实例与另一个实体的多个实例相关联。 换句话说&#xff0c;一个表中的每个记录与另一个表中的多个记录相关联。 让我们看看如何通过XML映射文件在Hibernate中定义这种关系。 1.实体关系图 假设我们已经在数据库中创建了学生表和部门表&#xff0…

java resize_OpenCV3 Java图像放大缩小 修改图像大小(Imgproc.resize)

Imgproc.resize()方法参数&#xff1a;src&#xff1a;输入&#xff0c;原图像&#xff0c;即待改变大小的图像&#xff1b;dst&#xff1a;输出&#xff0c;改变大小之后的图像&#xff0c;这个图像和原图像具有相同的内容&#xff0c;只是大小和原图像不一样而已&#xff1b;…

mongodb中Gson和java##Bean对象转化类

此类使用感觉比较繁琐, 每个字段加注解才可以使用, 不如mongoTemplate使用方便, 但如果使用mongo客户端的话, 还是比手动拼接快一点, 所以贴在这儿 package com.iwhere.util;import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java…

java中sql查询语句_JAVA中用 SQL语句操作小结

1、添加记录(INSERT)使用SQL语句的INSERT命令可以向数据库中插入记录&#xff0c;INSERT命令的基本形式为&#xff1a;INSERT INTO 表名 [(字段名1,字段名2…)] VALUES (值1,值2,…)若在输入记录时&#xff0c;每个字段均有内容&#xff0c;可省略表名后的字段名。该SQL语句用于…

专题:二分图匹配

挖坑转载于:https://www.cnblogs.com/bestwzh/p/6487477.html

camel eip_Apache Camel教程– EIP,路由,组件,测试和其他概念的简介

camel eip公司之间的数据交换增加了很多。 必须集成的应用程序数量也增加了。 这些接口使用不同的技术&#xff0c;协议和数据格式。 但是&#xff0c;这些应用程序的集成应以标准化的方式建模&#xff0c;有效实现并由自动测试支持。 企业集成模式&#xff08;EIP&#xff09;…

java map 不存在的key_java – HashMap表示即使它确实存在,Key也不存在

我遇到了一个有趣的问题,我很确定是HashMap的错.考虑以下调试代码(AMap是HashMap,key是传递给此方法的值)System.out.println("getBValues - Given: " key);System.out.println("getBValues - Contains Key: " AMap.containsKey(key));System.out.printl…

XML 解析器

XML Parser 所有现代浏览器都有内建的 XML 解析器。 XML 解析器把 XML 文档转换为 XML DOM 对象 - 可通过 JavaScript 操作的对象。 解析 XML 文档 下面的代码片段把 XML 文档解析到 XML DOM 对象中&#xff1a; if (window.XMLHttpRequest){// code for IE7, Firefox, Chrome,…

JavaOne和OOW 2015总结

大家好&#xff01; 终于&#xff0c;我回来了一个很棒的JavaOne和OOW2015。在这篇文章中&#xff0c;我想分享我的经验&#xff0c;一些照片和我参加的演讲的摘要。 会议前 我于2015年6月24日星期六乘Copa航空公司CLO-PTY-SFO飞往旧金山。 从哥伦比亚出发&#xff08;大约8小…

java mongodb dbref_Spring DATA MongoDB @DBref查询,or和and联合查询

DBref文档关联&#xff0c;在按该类型查询的时候&#xff0c;在字段名后加上关联表的字段名即可&#xff0c;如&#xff1a;Criteria.where("bloggroup.$id")&#xff0c;$id代表关联表的oid字段。or和and联合查询比如查询 (A 1 and b 2 )or (A 3 and b 4)&#x…

【hdoj_2152】Fruit(母函数)

题目&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2152 本题采用母函数模板求解&#xff0c;母函数模板如下&#xff1a; http://blog.csdn.net/ten_sory/article/details/59483762 本题中的价值v[i]均为1&#xff0c;s[i]A[i],e[i]B[i]&#xff0c;套用上述模板&am…

java holdslock_一种检测Java并发程序代码分支路径lock是否遗漏的方法

开发java程序中&#xff0c;程序员往往会用synchronized lock 进行临界资源保护和线程同步&#xff1b;android平台上&#xff0c;提供了一些技巧来减少锁被错误使用&#xff1a;使用Locked后缀作为函数名字&#xff1a;Locked函数被调用&#xff0c;需调用方(或者更上层调用方…