sql事务的隔离级别详细讲解
事务的隔离级别其实是SQL语言的标准,这里我就以自己比较常用的MySQL数据库为例进行介绍。
关于关系型数据库和非关系型数据库的对比,我之前写过一篇文章简单地作了一些介绍,隔离级别是ACID原则中的第三点 Isolation隔离性的重要内容。
有兴趣的读者可以出门左转,查看我之前的随笔。
好了,先上一下MySQL数据库中修改隔离级别的命令:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL
{READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
关于以上命令,有一些需要理解的点:
1)级别顺序 read uncommittd < read committed < repeatable read < serializable
我的理解是每一个级别都是在上一级别的基础上增加了表操作的限制。读者往下看就可以体会到这种限制的加强。
2)默认行为(不带session和global)是为下一个(未开始)事务设置隔离级别。如果使用GLOBAL关键字,此命令语句在全局中对从那点开始创建的所有新连接(除了不存在的连接)设置事务级别。注意需要SUPER权限做这个改变。使用SESSION 关键字为当前连接上执行的事务设置默认事务级别。另外, 任何客户端都能自由改变会话隔离级别(甚至在事务的中间),或者为下一个事务设置隔离级别。
具体操作读者可以同时打开多个终端,创建多个MySQL连接。在MySQL交互模式下直接输入以上的命令就可以体会一下以上不同级别的读写区别了。
下面是对四个隔离级别的介绍
1. Read Uncommitted 可以读取未提交的事务
在一个事务中执行查询操作,另外一个事务实例中执行更新或者插入操作,这些操作的数据是没有提交到磁盘或者数据库客户端的,那么第一个事务查询操作读取的数据可能是不真实的。即出现了所谓的脏读。
2. Read Committed 读取提交事务
在read uncommitted的基础上限制对未提交事务的查询操作的限制。也支持所谓的(Nonrepeatable Read)不可重复读。
不可重复读,其实实际理解上是不要求重复读,即一个事务(这里的事务指的是一个用户对数据库的操作,在退出对数据库操作前都为同一个事务)前后两次的读取内容可以是不同的,即允许在本事务查询的过程中其他事务对本事务查询的数据进行更新/增加其他行(相对于一定范围而言),这样就会出现两次读取的不一致性。
3. Repeatable Read 可重复读
在Read Committed的基础上限制本事务在执行查询操作的时候其他事务对本查询范围内的数据的修改操作,但允许插入新的数据。所以在本事务的前后两次范围(这里特指范围查询,因为非范围查询不会出现后面所述现象)查询中会出现幻读现象,即两次读取的数据量不同。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。关于这个强大的机制也许在之后的学习当中,会写写自己的一些学习心得。
4. Serilizable 串行化
数据库最高级别的隔离限制,即一个事务在执行查询操作的时候,不允许其他事务对本事务查询范围内的数据有任何操作,这里会引入一个共享锁的概念,即本事务的查询操作别读取的数据锁住了,必须等本事务完成之后才允许其他事务获取这个共享锁进行其他操作。
好了,理论介绍到这里,具体的区别还需要动手操作一下去体会的,而至于在实战中怎么使用,还是要看具体的数据量和业务逻辑来进行选择。
- 抓取占用CPU高的JAVA线程,进而找出有问题的WEB页面
- ASM 翻译系列第三十九弹:物理元数据AT表
- ASM 翻译系列第四十弹:理解ASM中 REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的含义
- 给XFN链接关系加上“nofollow”选项
- LVS中采用Jboss作为RealServer的配置要点
- 基于Prometheus的数据库监控
- Uva-------(11462) Age Sort(计数排序)
- hdu----(2848)Repository(trie树变形)
- 【MySQL】主从GTID复制修复
- hdu---(1800)Flying to the Mars(trie树)
- 解决Tomcat数据连接池无法释放
- hdu----(1075)What Are You Talking About(trie之查找)
- hdu--(1247)Hat’s Words(trie树)
- HDU----(4519)郑厂长系列故事——体检
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 【Pytorch 】笔记五:nn 模块中的网络层介绍
- docker浅入深出4
- BFE.dev前端刷题#58. 获取DOM tree高度
- 如何在Tungsten Fabric上整合裸金属服务器(附配置验证过程)
- 逐行阅读Spring5.X源码(三) BeanDefinition的实现类详解,拔高
- 逐行阅读Spring5.X源码(番外篇)BeanDefinition到底有多重要
- 逐行阅读Spring5.X源码(番外篇)AnnotatedBeanDefinitionReader的作用
- 逐行阅读Spring5.X源码(四) BeanFactory——核心容器bean工厂
- 逐行阅读Spring5.X源码(五) 初探BeanFactoryPostProcessor后置处理器,难,特别难。
- 逐行阅读Spring5.X源码(六) ClassPathBeanDefinitionScanner扫描器
- 逐行阅读Spring5.X源码(番外篇)自定义扫描器, Mybatis是如何利用spring完成Mapper扫描的
- 逐行阅读Spring5.X源码(七)扫描和注册神器 ConfigurationClassPostProcessor ,学此类者,胜过学九阳神功!胆小勿入!
- 「Mysql索引原理(三)」Mysql中的Hash索引原理
- RNN、lstm、gru详解
- 「Mysql索引原理(四)」单列索引