重新整理 mysql 基础篇————— 事务隔离级别[四]
前言
简单介绍一下事务隔离的基本
正文
Read Uncommitted(未提交读)
这个就是读未提交。就是说在事务未提交的时候,其他事务也可以读取到未提交的数据。
这里举一个例子,还是前一篇的例子。
假如一个张表A=500,B=300,(500,300)有一个事务a和一个事务b,a事务是给A增加100,然后给B减少100。b事务是给B减少100,给A增加100。

假如步骤如图所示。
A 读取到的数据是500。
B读取到的数据是300。
B读取到的数据是200。
A读取到的数据是600
假设a先提交,b后提交。那么就是b事务提交的最后的结果,A为700,B为200。
反过来,如果是b提交,而a后提交,那么就是a最后提交的结果,A为600,B为100。
这个时候是3步骤就出现问题了,因为读取为未提交的事务。
Read Commited(提交读)
一个事务只能看见自己所做的修改,也就是说一个事务在提交之前,所做的修改其他事务看不见。
这样同样会存在问题。

比如说,A B C 分别是10 11 12,有两个事务,a是给A加一,b是两次执行,C=A+B。
C=A+B 那么C就是21。
A=A+1 那么A就是11
A 事务进行提交,那么A就是11了。这个时候b事务可以读取到A。
C=A+B,那么C等于22了。
这种情况要看是否符合你的需求。比如说,一个数据库就是一直来计算一些数的总值的。那么是符合你的需求的。
但是如果是第四步,C=C+B,那么是可能不符合你的需求的。因为C要计算的是C=A+B+A。也就是C=2*A+B,因为A中间变换了,那么结果不符合预期是不符的。
这种看需求。
repeatable 可重复读
该级别保证了同一个事物多次读取同样记录的结果一致。
比如说,上面Read Commited(提交读)的例子中,两次读取A都是一致的,在同一个事物中,多次读取结果不变。
这里可能有人会提出另一个疑问,比如说有两个事务,同样是事务a和事务b。
疑问如下:
比如A=1
执行过程如下:

因为是可重复读,那么第四步A中,A还是1,所以最终A结果是2。
是啊,这样不就出问题了吗?是的,如果数据库像这么简单,那么的确出问题了,因为数据库在执行过程中会做一些判断,会给数据加上锁,有了锁那么可能上面第2步,就会阻塞,而去执行第四步了。
锁,后面介绍。
serializable 可串行化
serializable会在读取的每一行加上锁,强制事务串行执行。这里需要注意的是串行化,并不是说事务一条一条执行。
比如说,事务a只修改A数据,然后事务b只修改B数据,这时候依然是并发的,因为他们数据并不冲突。
串行化,因为加了锁,所以会变得串行。比如事务a修改A然后修改B,事务b修改B然后修改了A。假如因为a修改了A,给A加了锁,后面事务b修改了B给B加了锁。故而a事务在等待B释放锁,b事务在等A释放锁。故而系统会检查到死锁,故而只能执行A或B,然后执行下一个。
结
下一节,隔离的实现方式。
重新整理 mysql 基础篇————— 事务隔离级别[四]的更多相关文章
- 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- 面试必问的MySQL锁与事务隔离级别
之前多篇文章从mysql的底层结构分析.sql语句的分析器以及sql从优化底层分析, 还有工作中常用的sql优化小知识点.面试各大互联网公司必问的mysql锁和事务隔离级别,这篇文章给你打神助攻,一飞 ...
- 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- mysql中不同事务隔离级别下数据的显示效果--转载
事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...
- 浅谈mysql中不同事务隔离级别下数据的显示效果
事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...
- 事务,Oracle,MySQL及Spring事务隔离级别
一.什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种): 原子性 (atomicity):强调事务的不可分割:一致性 (consiste ...
- MySQL事物(一)事务隔离级别和事物并发冲突
数据库的操作通常为写和读,就是所说的CRUD:增加(Create).读取(Read).更新(Update)和删除(Delete).事务就是一件完整要做的事情.事务是恢复和并发控制的基本单位.事务必须始 ...
- 在MySQL中设置事务隔离级别有2种方法:
在MySQL中设置事务隔离级别有2种方法: 1 在my.cnf中设置,在mysqld选项中如下设置 [mysqld] transaction-isolation = READ-COMMITTED 2 ...
- MySql锁和事务隔离级别
在讲mysql事物隔离级别之前,我们先简单说说mysql的锁和事务. 一:数据库锁 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对同一张表进行操作,比如有的在读取该行数据,其他的尝试去 ...
随机推荐
- android 资料
https://xfans.gitbooks.io/android-book/content/issue-39/Android%20dex%E5%88%86%E5%8C%85%E5%AF%BC%E8% ...
- WPF之事件绑定命令
目录 事件绑定意义 无参数的事件绑定 带EventArgs参数的事件绑定 使用事件绑定 扩展:基于InvokeCommandAction源码的实现(推荐) 参考资料 事件绑定意义 一般事件的处理程序都 ...
- Ubuntu20.04安装和配置JDK
首先在官网下载Linux系统的jdk到本地 创建/java目录 sudo mkdir /java 这是直接创建在根目录下的. 3. 将下载的jdk压缩包移动到java文件夹 sudo mv 你的安装包 ...
- php笔记之魔术方法、魔法常量和超全局变量
一.魔术方法(13个)1.__construct()实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用.2.__destru ...
- Asp.NetCore Web开发之创建项目
这一节,开始讲一下如何创建一个Asp.netCore Web项目,有两种常用的方式,一种是通过.NetCore SDK使用命令创建,另一种如果你使用的VisualStudio,可以直接根据引导创建. ...
- Git安装教程最新版本(国内gitee国外github)
Git安装教程最新版本(国内gitee国外github) 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 获取大师使用的typora主题: http://w ...
- [bug] IDEA springboot项目 访问静态资源 html页面 报404
原因 复制的静态资源目录没有编译 解决 检查target目录中,是否有static目录,若没有,重新右键项目install即可 若还不能解决,尝试浏览器缓存和IDEA编译设置,详见参考链接 参考 ht ...
- [java] IDEA
快捷键 shift+shift:搜索 ctrl+d:复制行 ctrl+x:删除行 ctrl+p:查看方法参数 ctrl+o:查看类方法 ctrl+h:查看类结构 ctrl+i:实现接口方法 ctrl+ ...
- centos7 连接打印机
centos7 连接打印机 2017-08-07 15:05:33 五岳寻仙客 阅读数 2531更多 分类专栏: Liunx的日常使用 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版 ...
- 036.Python的TCP语法
TCP语法 1 建立一个socket对象 import socket sk = socket.socket() print (sk) 执行 [root@node10 python]# python3 ...