前言

简单介绍一下事务隔离的基本

正文

Read Uncommitted(未提交读)

这个就是读未提交。就是说在事务未提交的时候,其他事务也可以读取到未提交的数据。

这里举一个例子,还是前一篇的例子。

假如一个张表A=500,B=300,(500,300)有一个事务a和一个事务b,a事务是给A增加100,然后给B减少100。b事务是给B减少100,给A增加100。

假如步骤如图所示。

  1. A 读取到的数据是500。

  2. B读取到的数据是300。

  3. B读取到的数据是200。

  4. 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。

  1. C=A+B 那么C就是21。

  2. A=A+1 那么A就是11

  3. A 事务进行提交,那么A就是11了。这个时候b事务可以读取到A。

  4. 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 基础篇————— 事务隔离级别[四]的更多相关文章

  1. 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...

  2. 面试必问的MySQL锁与事务隔离级别

    之前多篇文章从mysql的底层结构分析.sql语句的分析器以及sql从优化底层分析, 还有工作中常用的sql优化小知识点.面试各大互联网公司必问的mysql锁和事务隔离级别,这篇文章给你打神助攻,一飞 ...

  3. 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...

  4. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

  5. 浅谈mysql中不同事务隔离级别下数据的显示效果

    事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...

  6. 事务,Oracle,MySQL及Spring事务隔离级别

    一.什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种): 原子性 (atomicity):强调事务的不可分割:一致性 (consiste ...

  7. MySQL事物(一)事务隔离级别和事物并发冲突

    数据库的操作通常为写和读,就是所说的CRUD:增加(Create).读取(Read).更新(Update)和删除(Delete).事务就是一件完整要做的事情.事务是恢复和并发控制的基本单位.事务必须始 ...

  8. 在MySQL中设置事务隔离级别有2种方法:

    在MySQL中设置事务隔离级别有2种方法: 1 在my.cnf中设置,在mysqld选项中如下设置 [mysqld] transaction-isolation = READ-COMMITTED 2 ...

  9. MySql锁和事务隔离级别

    在讲mysql事物隔离级别之前,我们先简单说说mysql的锁和事务. 一:数据库锁 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对同一张表进行操作,比如有的在读取该行数据,其他的尝试去 ...

随机推荐

  1. android 资料

    https://xfans.gitbooks.io/android-book/content/issue-39/Android%20dex%E5%88%86%E5%8C%85%E5%AF%BC%E8% ...

  2. WPF之事件绑定命令

    目录 事件绑定意义 无参数的事件绑定 带EventArgs参数的事件绑定 使用事件绑定 扩展:基于InvokeCommandAction源码的实现(推荐) 参考资料 事件绑定意义 一般事件的处理程序都 ...

  3. Ubuntu20.04安装和配置JDK

    首先在官网下载Linux系统的jdk到本地 创建/java目录 sudo mkdir /java 这是直接创建在根目录下的. 3. 将下载的jdk压缩包移动到java文件夹 sudo mv 你的安装包 ...

  4. php笔记之魔术方法、魔法常量和超全局变量

    一.魔术方法(13个)1.__construct()实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用.2.__destru ...

  5. Asp.NetCore Web开发之创建项目

    ​这一节,开始讲一下如何创建一个Asp.netCore Web项目,有两种常用的方式,一种是通过.NetCore SDK使用命令创建,另一种如果你使用的VisualStudio,可以直接根据引导创建. ...

  6. Git安装教程最新版本(国内gitee国外github)

    Git安装教程最新版本(国内gitee国外github) 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 获取大师使用的typora主题: http://w ...

  7. [bug] IDEA springboot项目 访问静态资源 html页面 报404

    原因 复制的静态资源目录没有编译 解决 检查target目录中,是否有static目录,若没有,重新右键项目install即可 若还不能解决,尝试浏览器缓存和IDEA编译设置,详见参考链接 参考 ht ...

  8. [java] IDEA

    快捷键 shift+shift:搜索 ctrl+d:复制行 ctrl+x:删除行 ctrl+p:查看方法参数 ctrl+o:查看类方法 ctrl+h:查看类结构 ctrl+i:实现接口方法 ctrl+ ...

  9. centos7 连接打印机

    centos7 连接打印机 2017-08-07 15:05:33 五岳寻仙客 阅读数 2531更多 分类专栏: Liunx的日常使用   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版 ...

  10. 036.Python的TCP语法

    TCP语法 1 建立一个socket对象 import socket sk = socket.socket() print (sk) 执行 [root@node10 python]# python3 ...