你了解MySQL的加锁规则吗?】的更多相关文章

大家好,我是咔咔 不期速成,日拱一卒 本期来聊聊MySQL的加锁规则,知道这些规则后可以判断SQL语句的加锁范围,同时也可以写出更好的SQL语句,防止幻读问题的产生,在能力范围内最大程度的提升MySQL并发处理事务能力. 现在你应该知道了MVCC解决了快照读下的幻读问题,但当前读的幻读问题还是基于锁解决的,也就是next-key lock. 最新文章 死磕MySQL系列总目录 为什么MySQL字符串不加引号索引失效?<死磕MySQL系列 十一> 打开order by的大门,一探究竟<死磕…
Insert操作加锁规则 1.INSERT操作会对新插入的记录加行锁(ROW LOCK)+排他锁(X LOCK),不会产生任何GAP锁和Next-Key锁 2.在插入记录前,会向插入记录所在位置申请意向插入Gap锁(Insertion Intention Gap Lock),相同区间的意向插入Gap锁不会冲突. 3.对于唯一索引,如果插入记录时表中已存在相同键值记录(被其他事务修改且未提交),即存在唯一键冲突,会尝试在已有记录上加读锁,然后等待. 官方文档: INSERT sets an exc…
===================================================================== 淘宝林晓斌总结 在可重复读事务隔离级别下,加锁规则如下: 原则1.加锁的基本单位是Next-Key Lock(前开后闭区间). 原则2.查找数据过程中访问过得对象才会被加锁. 优化1.对唯一索引做等值查询,对匹配的索引记录加锁时,Next-Key Lock会退化为Row Lock. 优化2.在索引上做等值查询,从第一个满足等值查询条件的索引记录开始向右遍历记…
注:加锁规则指的是next-key lock,如果还不了解next-key lock,请阅读上一篇博客 加锁规则可以概括为:两个原则.两个优化和一个bug: 原则1:加锁的基本单位是next-key lock,前开后闭 原则2:查找过程中访问到的对象才会加锁 优化1:索引上的等值查询,给唯一索引加锁的时候,next-key lock退化成行锁 优化2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁 1个bug:唯一索引上的范围查询会访问到不满…
在上一篇文章,我们学习了间隙锁和next-key lock,但是不知道怎么加锁,有哪些规则.间隙锁的概念不太好理解,尤其是配合上行锁后,很容易在判断是否会出现锁等待的问题上犯错. 今天我们就来学习一下加锁规则吧. 在学习前要说明一点,以下的规则只限于版本范围:5.x系列<=5.7.24,8.0系列<=8.0.13. 加锁规则 这个加锁规则包含两个"原则".两个"优化"和一个"bug". 原则1:加锁的基本单位是next-key loc…
准备测试数据: ## 开启InnoDB Monitor SET GLOBAL innodb_status_output=ON; SET GLOBAL innodb_status_output_locks=ON; ## 创建测试表 DROP TABLE IF EXISTS tb1001; CREATE TABLE `tb1001` ( `order_id` ) NOT NULL, `order_num` ) DEFAULT NULL, `order_type` ) DEFAULT NULL, PR…
准备测试数据: ## 开启InnoDB Monitor SET GLOBAL innodb_status_output=ON; SET GLOBAL innodb_status_output_locks=ON; ## 创建测试表 DROP TABLE IF EXISTS tb1001; CREATE TABLE `tb1001` ( `order_id` ) NOT NULL, `order_num` ) DEFAULT NULL, `order_type` ) DEFAULT NULL, PR…
字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的基础上特定的字符排序方式,排序规则是基于字符集的,是对字符集在排序方式维度上的一个划分.排序规则是依赖于字符集的,一种字符集可以有多种排序规则,但是一种排序规则只能基于某一种字符集的比如中文字符集,也即汉字,可以按照“拼音排序”.“按姓氏笔划排序”等等.而对于英语,就没有“拼音”和“姓氏笔画”,但是可以分为区…
什么是脏读,不可重复读,幻读 1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据. 2. 不可重复读 :是指在一个事务内,多次读同一数据.在这个事务还没有结束时,另外一个事务也访问该同一数据.那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的.这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读.例如,一个编辑人员两次读取…
MySQL 字符集和校验规则工作原理 字符编码相关参数 数据流中的转码过程 校验规则 Tips:字符集和校验规则总是相伴的 一 从简单的建库语句开始 CREATE DATABASE [IF NOT EXISTS] <db_name> [[DEFAULT] CHARACTER SET <db_charset>] [[DEFAULT] COLLATE <db_collation>]; db_name : 数据库名 必填 db_charset:数据库的字符集 缺省为服务器字符…
前言 前阵子参与了字节跳动后端青训营,其中大项目编写涉及到数据持久化一般选择使用MySQL.由于时间原因,数据库使用我选择了无脑三板斧:1. 建立了索引加速查询.2. 关闭自动提交事务.3. 在需要确保原子性的数据库操作之间手动创建和提交事务. 这么一看,仿佛即使是实际开发也与你此前听闻的一些MySQL相关名词:读写锁.间隙锁.多版本并发控制.redo log.bin log.undo log毫不相干,在讲本文的主题之前,我先引入一个真实场景. 在某次不够规范的小组开发过程中,开发成员选择测试程…
背景:有一次定位问题发现,在同一个session连接中对MYSQL部分表加锁,导致其它未加锁的表不能访问. 用Spring管理MYSQL数据连接,在多线程访问数据库的情况下容易出问题.一个线程中对部分表加锁了,尚未释放.其它线程访问同一数据库中其它未加锁的表,也会访问失败. 测试了一把: 步骤一.使用Navicat连接MYSQL数据库.编写如下4句SQL. LOCK TABLES tbl_A WRITE; LOCK TABLES tbl_B WRITE; DELETE FROM tbl_B; U…
在mysql中存在着各种utf8编码格式,如下表:1)utf8_bin2)utf8_general_ci utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写.utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感. 现在假设执行如下命令:create table test_bin (name varchar(32) not null primary key,age int unsigned not null) engine = In…
add by zhj: 看来我对MySQL的理解还有待深入,水还是挺深的啊,MySQL给记录加锁时,可以通过innodb_lock_wait_timeout参数设置超时时间, 如果加锁等待超过这个时间,就会回滚,但回滚的话有两种方式:第一种:回滚当前加锁的这条语句:第二种:回滚整个事务.这两种方式是通过参数 innodb_rollback_on_timeout来控制的.如果是OFF,表示加锁超时回滚时,只回滚加锁超时的那条SQL语句:如果是ON,表示回滚整个事务.默认 是OFF.在<MySQL…
TPS计算规则 在MYSQL 中,TPS(Transaction Per Second)的计算方法为 (com_commit+com_rollback)/time,但com_commit和com_rollback记录的是显式事务的,因此隐式提交的事务不会被算到TPS中,如果程序未使用显示事务,即使在高并发事务下, 使用MYSQL看到的TPS也会很低. Demo验证,分别使用存储过程显式和隐式(自动提交)1000个事务: DELIMITER $$; CREATE PROCEDURE USP_T2(…
MySQL中的排序规则.在新建MySQL数据库或表的时候经常会选择字符集和排序规则.数据库用的字符集大家都知道是怎么回事,那排序规则是什么呢? 排序规则:是指对指定字符集下不同字符的比较规则.其特征有以下几点: 1. 两个不同的字符集不能有相同的排序规则 2. 两个字符集有一个默认的排序规则 3. 有一些常用的命名规则.如_ci结尾表示大小写不敏感(caseinsensitive),_cs表示大小写敏感(case sensitive),_bin表示二进制的比较(binary). utf-8有默认…
1.配置mysql,添加监控用的账号,授予查看所有用户线程/连接的权限 GRANT PROCESS ON *.* TO 'zabbix'@'127.0.0.1' identified BY '20c114c4$65bec20@e1eb6ee4d6614ba'; Flush privileges; 2.准备脚本 获取端口的脚本 #!/usr/bin/python import os import json#获取mysql端口,使用root权限执行获取端口,过滤出mysql的,将':'转为空格,aw…
转于:https://blog.csdn.net/claram/article/details/77574600 首先明确:为什么要用联合索引? 对于查询语句“SELECT E.* FROM E WHERE E.e1=1 AND E.e3=2”涉及到两列,这个时候我们一般采用一个联合索引(e1, e3):而不用两个单列索引,这是因为一条查询语句往往应为mysql优化器的关系只用一个索引,就算你有两个索引,他也只用一个:在只用一个的基础之上,联合索引是会比单列索引要快的: 下面讲讲联合索引的使用规…
环境介绍:centeros 7 + mysqld5.7 当我们装完数据库以后,使用临时密码登录到数据库去更改一个简单的密码,如 set password='; 结果出现以下提示: ERROR (HY000): Your password does not satisfy the current policy requirements 那么导致问题的原因就是密码规则没有修改喽,以下提供两种方法更改简单密码: .在/etc/my.cnf关闭密码规则 validate_password = off .…
文章转载自:http://www.fanyilun.me/2017/04/20/MySQL%E5%8A%A0%E9%94%81%E5%88%86%E6%9E%90/ 以下实验数据基于MySQL 5.7. 假设已知一张表my_table,id列为主键 id name num 1 aaa 100 5 bbb 200 8 bbb 300 10 ccc 400 1. 查询命中聚簇索引(主键索引) 1.1 如果是精确查询,那么会在命中的索引上加record lock // 在id=1的聚簇索引上加X锁 u…
MySQL数据库设计总结   规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节.另外MyISAM数据和索引是分开,而InnoDB的数据存储是按聚簇(cluster)索引有序排列的,主键是默认的聚簇(cluster)索引,因此MyISAM虽然在一般情况下,查询性能比InnoDB高,但InnoDB的以主键为条件的查询性能是非常高的. 规则2:…
今天在设置mysql某用户的密码时,出现了此报错:   ERROR 1819 (HY000) Your password does not satisfy the current policy requirements   后经过一波检查,发现可以通过控制mysql某两个字段来实现复杂度改变: @@validate_password_length: 密码最短长度,默认为8位. @@validate_password_policy: 密码复杂度,分为low.medium.high三个等级,分别对应…
为什么要优化系统的吞吐量瓶颈往往出现在数据库的访问速度上随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢数据是存放在磁盘上的,读写速度无法和内存相比 如何优化设计数据库时:数据库表.字段的设计,存储引擎利用好MySQL自身提供的功能,如索引等横向扩展:MySQL集群.负载均衡.读写分离SQL语句的优化(收效甚微) 字段设计字段类型的选择,设计规范,范式,常见设计案例原则:尽量使用整型表示字符串存储IPINET_ATON(str),address to number INET_N…
单个表锁定: 格式: LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},……] 例子: lock tables db_a.tbl_aaa read;  // 锁定了db_a库中的tbl_aaa表 解锁: unlock tables; 全局表锁定: 命令: FLUSH TABLES WITH READ LOCK;  // 所有库所有表都被锁定只读 解锁: unlock tables; 注意:以上两个锁表语句在执行的时候都需要…
为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引.本小节将向读者介绍一些索引的设计原则. 1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录.例如,学生表中学号是具有唯一性的字段.为该字段建立唯一性索引可以很快的确定某个学生的信息.如果使用姓名的话,可能存在同名现象,从而降低查询速度. 2.为经常需要排序.分组和联合操作的字段建立索引 经常需要ORDER BY.GROUP BY.DISTINCT和UNION等操作的字段,排序操…
author:skatetime:2013/05/14 Mysql分表准则 在大量使用mysql时,数据量大.高访问时,为了提高性能需要分表处理,简介下mysql分表的标准,后续会继续补充 环境:业务类型:OLTP硬件:cpu:8cpu 2.4GHZmem:48G磁盘:raid5 6×sas 什么样的表需要拆分:根据表的体积.表的行数.访问特点来衡量表是否需要拆分 一.拆分标准是:  1.表的体积大于2G或行数大于1000w,以单表主键等简单形式访问数据,这个时候需要分表  2.表的体积大于2G…
注意事项: 1)索引并不是越多越好 创建索引是会占用非常多的硬盘空间的,一般来说,一张表的索引的大小是其数据大小的2到3倍: 所以不要随便创建无用的索引,一般来说,只要给学用来做条件(where.order by.group having)的字段加索引就足够了 2)更新.重建索引 REPAIR TABLE tbl_name QUICK;…
1.表的主键.外键必须有索引:2.数据量超过300的表应该有索引: 3.经常与其他表进行连接的表,在连接字段上应该建立索引: 4.经常出现在Where子句中的字段,特别是大表的字段,应该建立索引: 5.索引应该建在选择性高的字段上: 6.索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引: 7.复合索引的建立需要进行仔细分析:尽量考虑用单字段索引代替: A.正确选择复合索引中的主列字段,一般是选择性较好的字段: B.复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单…
目录 前言 一.乐观锁 添加version字段 二.悲观锁 读锁 全表锁(LOCK TABLE 表 READ) 行锁(SELECT ... LOCK IN SHARE MODE) 写锁 全表锁(LOCK TABLE 表 WRITE) 行锁(SELECT ... FOR UPDATE) 前言 锁总体可以分为乐观锁和悲观锁,简单说,乐观锁用版本号控制,悲观锁用锁控制. 下面是待会要用来测试的数据 # 添加一个user表 CREATE TABLE `users` ( `id` int(11) NOT…
1.背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因. 注:MySQL是一个支持插件式存储引擎的数据库系统.本文下面的所有…