mysql的隔离性和锁
INNODB的隔离性质
INNODB的事务支持4种隔离机制,分别是 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, and SERIALIZABLE. 其中默认的为REPEATABLE READ.
下面详细分析这4种隔离性的联系和区别。
REPEATABLE READ
在不用锁的查询语句中,此隔离级别保证了每次事务读取到的数据是一致的。
在用锁的查询中(update等),如果查询是指定索引查询,那么只会在锁住索引中的某个值,如果是指定索引的范围查询,那么会在范围的间隙加锁,也就是间隙锁。
此隔离级别会有重复读取的问题。
当你在一个事务中查询两次,可能返回的结果不一样,这是由于在第一次查询结束后,此隔离级别只会锁住对应的值和值的间隙,另一个事务对表进行了插入了原来不存在的值(也就是没有被锁住的值),那么就会导致两次查询的结果不一致。
// 重复读问题的解释
https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html
READ COMMITTED
比REPEATABLE READ弱一级,在指定索引查询时,如果是范围查询那么不会加间隙锁,只会锁住某个值,这就会导致幻读的问题。
举例而言:
当你有一个索引列,数据为1,3,5,当你查询这一列>1的数据的时候,由于没有间隙锁的存在,mysql只会锁住3和5,而这个时候有另一个事务插入了4,之后又回滚了,那么之前的查询就会查询4,而之后的查询查不到4,这就是幻读的问题。
幻读的意思是,当一个事务执行两次,一次没有读取到的行,第二次却读取到了,那一行就称为魔幻的一行..
// 幻读的解释
https://dev.mysql.com/doc/refman/8.0/en/innodb-next-key-locking.html
READ UNCOMMITTED
比READ COMMITTED弱一级,没有锁的隔离,会导致脏读。这是由于,当某些行没有被锁住的导致其他事务可以进行更新操作,从而引发读取到脏数据。
脏读的意思是,读取到其他事务已经修改但是还没有提交的数据。
SERIALIZABLE
在REPEATABLE READ的基础上,自动的加入了 'lock in share' 语句。也就是说,在select的过程中,不允许其他需要独占锁的操作发生(update等),只允许需要共享锁的操作。
此隔离级别可以保证数据读取完整的一致性,但是级会导致所有需要独占锁的操作都变成了串行执行,性能和表锁已经没有区别了。
参考
mysql术语大全
https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_dirty_read
mysql官网对隔离性的介绍
https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html
表级锁和行级锁
表级锁
在INNODB还没出现之前,MyISAM数据库引擎只支持表级锁,包括表级共享锁和表级独占锁。
共享锁支持多个操作同时执行,也就是并发执行,在一个操作拥有共享锁的情况下,其他操作是无法获取到独占锁的。
独占锁只能串行执行。
行级锁
INNODB支持行锁,将锁定对象的粒度细化,可以增加并发性能。
需要注意的是行级锁是建立在索引之上的,也就是说在查询没有索引的字段的情况下,还是会使用表锁。
参考
对MYISAM引擎和INNODB引擎很详细的对比分析
https://baijiahao.baidu.com/s?id=1610581108528334819&wfr=spider&for=pc
关于在非阻塞的情况下读取一致性的细节
在INNODB的存储引擎场景下,每次查询,mysql都会给出当前表的快照,也就是说在该查询之前其他提交的事务都会被感知,而查询开始之后,其他提交的事务就不会被感知。
举例而言
当你select count(*) from table的时候,其实统计的是当前表的快照,不会获取任何锁,如果与此同时,有另一个插入操作,那么这两个操作是完全可以同时进行的。当然,这个结果可能不是你业务上希望看到的,可能你想要强一致性,也就是在统计数据量的时候不允许其他插入或者删除操作,那么你可以先lock table; select count(*) from table; 最后unlock table;通过表锁的方式保证数据的强一致性。
mysql的隔离性和锁的更多相关文章
- mysql 事务 隔离性 锁
1.四大特性 1.1 原子性(Atomicity) 一个事务是不可分割的最小工作单位.一个事务是不可分割的最小工作单位. 利用undo log保证原子性,undo log记录的是操作的反向语句,例如执 ...
- MySql的隔离级别和锁的关系
一.事务的4个基本特征 Atomic(原子性): 事务中包括的操作被看做一个逻辑单元.这个逻辑单元中的操作要 么所有成功.要么所有失败. Consistency(一致性): 仅仅有合法的数据能 ...
- 19.10.11学习日记随笔 mysql事务隔离性
一天的感悟 学习事务的处理方式,其中反想自己学过的flask 默认是开启事务的,flask_sqlalchemy每次在提交时都是需要commit,或者失败是需要rollback回滚操作的,其实pyth ...
- 跟面试官侃半小时MySQL事务隔离性,从基本概念深入到实现
提到MySQL的事务,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关. 而事务的ACID(即原子性Atomicity.一致性Consiste ...
- 详解Mysql事务隔离级别与锁机制
一.概述 我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能 就会导致我们说的脏写. 胀读和不可重复读.幻读这些问题. 这些问题的本质都是数据库的多事务并 ...
- MySQL事务隔离级别,锁(转)
add by zhj: 本文针对的是MySQL的InnoDB存储引擎,不适用于MySQL的其它存储引擎和其它数据库 原文:MySQL数据库事务隔离级别(Transaction Isolation Le ...
- Mysql事务隔离级别和锁机制
一.Spring支持四种事务隔离级别: 1.ISOLATION_READ_UNCOMMITTED(读未提交):这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据. 2.ISOLAT ...
- 理解MySql事务隔离机制、锁以及各种锁协议
一直以来对数据库的事务隔离机制的理解总是停留在表面,其内容也是看一遍忘一边.这两天决定从原理上理解它,整理成自己的知识.查阅资料的过程中发现好多零碎的概念假设串起来足够写一本书,所以在这里给自己梳理一 ...
- autocommit 隔离级别 next lock gap lock 事务隔离级别和锁
autocommit 隔离级别 https://www.ibm.com/developerworks/cn/opensource/os-mysql-transaction-isolation-leve ...
随机推荐
- 【黑金原创教程】【TimeQuest】TimeQuest原创教程连载导读【连载完成,共七章】
[第一章]TimeQuest 静态时序分析模型的概念 [第二章]TimeQuest模型角色,网表概念,时序报告 [第三章]TimeQuest 扫盲文 [第四章]内部延迟与其他 [第五章]网表质量与外部 ...
- Swift - 实现tableView单选系统样式
// 实现tableView单选 import UIKit class ViewController: UIViewController { var tableView: UITableView! o ...
- 【gulp】前端自动化工具---gulp的使用(一)------【巷子】
什么是gulp? 基于node的自动化构建工具 扩展:开发的时候分为2个节点一个是开发阶段 另一个是部署阶段 开发阶段:源文件不会被压缩 部署阶段:所有文 ...
- Oracle之归档模式与非归档模式
归档模式和非归档模式 在DBA部署数据库之初,必须要做出的最重要决定之一就是选择归档模式(ARCHIVELOG)或者非 归档模式(NOARCHIVELOG )下运行数据库.我们知道,Oracle 数据 ...
- HDU_2586_How far away ?
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- nginx:负载均衡的session共享
一.场景 当nginx做了负载均衡之后,同一个ip的url请求服务器的时候,负载均衡会根据每台服务器的权重等一些设置将请求转发到不同的服务器上去进行处理,这样的话针对一些带有状态请求的情况来说就是个很 ...
- python中的接口和依赖注入
首先,我们必须明确的一点是:python里无接口类型,定义接口只是一个人为规定,在编程过程自我约束 python的类是可以写任意个方法的 定义一个接口对继承类进行约束,接口里有什么方法,继承类就必须有 ...
- Python开发【笔记】:探索Python F-strings
F-strings 在python3.6.2版本中,PEP 498 提出一种新型字符串格式化机制,被称为“字符串插值”或者更常见的一种称呼是F-strings(主要因为这种字符串的第一个字母是f) 简 ...
- 巧用Salt,实现CMDB配置自动发现
随着互联网+新形势的发展,越来越多的企业步入双态(稳敏双态)IT时代,信息化环境越来越复杂,既有IOE三层架构,也有VCE.Openstack等云虚拟化架构和互联网化的分布式大数据架构.所以,企业急需 ...
- PhotoSwipe中文API(四)
在幻灯片自定义HTML内容 为了使PhotoSwipe显示HTML内容的幻灯片,你需要在幻灯片对象定义html属性.它应该包含HTML字符串或DOM元素对象. var items = [ // sli ...