前言

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

正文

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. 逆向 stdio.h 函数库 fwrite 函数(调试版本)

    0x01 fwrite 函数 函数原型: size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 函数功能:把 ...

  2. R3获取kernel32地址

    获取Kernel32地址 如果是搞PE变形或者PE重构,再或者代码注入,很多时候我们要动态获取Loadlibrary()以及GetPeocAddress()两个函数的地址,通过这两个函数再动态获取其他 ...

  3. Etcd中Raft日志复制的实现

    Raft state of log commitIndex : A log entry is committed once the leader that created the entry has ...

  4. JWT 基本使用

    JWT 基本使用 在上一节中 session 共享功能使用 redis 进行存储,用户量激增时会导致 redis 崩溃,而 JWT 不依赖服务器,能够避免这个问题. 1.传统 session 1.1. ...

  5. [Python] execl读写

    相关库 读:xlrd 写:xlwt 案例 要求: 将图1中的数据导以图2的形式写入另一个文件中 第一列索引关系:{1:K1-B1,2:K1-B2} ...(18列) 思路: 按行读取数据,根据索引关系 ...

  6. centos保存rpm到本地以及使用yum完全卸载软件包

    目录 保存安装的rpm到本地 方法一: 方法二(推荐): yum卸载软件包包括依赖 保存安装的rpm到本地 方法一: [root@ServerA ~]# vim /etc/yum.conf [main ...

  7. 好好好重要常用必备linux命令

    查看当前目录下文件个数: $find ./ | wc -l 以上这个命令用到的频率如此之高,以至于我们需要为它建立一个快捷命令方式: 在.bashrc 中设置命令别名: alias lsl='ls - ...

  8. [rhel-media] :Yum软件仓库唯一标识符,避免与其他仓库冲突。

    第1步:进入到/etc/yum.repos.d/目录中(因为该目录存放着Yum软件仓库的配置文件). 第2步:使用Vim编辑器创建一个名为rhel7.repo的新配置文件(文件名称可随意,但后缀必须为 ...

  9. Microk8s 安装helm3

    Microk8s 安装helm3 原本使用官方的命令时这样的.但是使用的是官方的源,网络极不稳定.就出现了下面的状况.解决方法是更改为国内的源. microk8s enable helm3 curl: ...

  10. linux 详解useradd 命令基本用法

    linux 详解useradd 命令基本用法 时间:2019-03-24 本文章向大家介绍linux 详解useradd 命令基本用法,主要包括linux 详解useradd 命令基本用法使用实例.应 ...