并行数据库存在着几种常见不一致问题:

1.更新丢失:两个并发的写进程同时修改某内容,一个没修改完提交之后另一个又提交,导致其覆盖了第一个提交的写进程内容。

2.脏读:一个操作读到了另外一个操作没有提交的事物,但这个操作是不准确的,有可能被修改,比如回滚

3.不可重复度:同一次查找中的两次读的结果不一样。这里分为虚读和幻读,虚读是对于单条数据两次读不一样,幻读是第二次读比第一次读的结果集条数增多。

对应的数据库有四种隔离级别:

1.读未提交

写的时候禁止其他进程的写,这样两个写进程不能同时进程,也就不能出现更新丢失的问题。但写的进程不禁止读进程,这就还可能出现读脏数据。

2.读提交

写进程禁止读进程。只有写提交之后才能读,这样就防止了脏读现象的出现。但是注意此时读不禁止写,因为读脏数据和不可重复读不一样,读脏数据是指读到未提交的事物,不可重复度是两次读提交的事物都有可能不一样,读允许写,还会发生不可重复读现象,但是不能发生读脏数据现象。

3.可重复读

读禁止写,这时不会出现不可重复读,即两次读不一样的现象了

4.序列化

最严格的隔离机制,即只能严格的一个操作接一个执行,不能并发了

附加 :

MySQL实现事务的隔离机制:利用数据库锁+MVCC的机制实现。

  • 读未提交:加排它锁,但排它锁只组织对其锁定数据加读或写的锁,对于不加锁读的读就不起作用,所以写禁止写,写不禁止读
  • 读提交:写用排它锁,读是用MVCC机制,读当前版本,写的时候生成新版本,所以当前被锁住的版本不会出现脏读,但是会出现不可重复读(另一次读也拿到了被写过的最新版本。)
  • 可重复读:READ COMMITTED级别不同的是MVCC版本的生成时机,即:一次事务中只在第一次select时生成版本,后续的查询都是在这个版本上进行,称为快照读。写也是只改变了当前版本号,但是select查询仍基于之前的版本号,解决了虚读,即不受改变影响,但插入数据的话,还是会出现幻读现象(条数不一致)。引入了next-Key(当前读)机制,当select为范围的时候,在数据之间加了间隙锁,不允许插入。

再附加:

什么是MVCC:

MVCC(多版本并发控制)多版本并发控制,顾名思义,在并发访问的时候,数据存在版本的概念,可以有效地提升数据库并发能力,常见的数据库如MySQL、MS SQL Server、IBM DB2、Hbase、MongoDB等等都在使用。简单讲,如果没有MVCC,当想要读取的数据被其他事务用排它锁锁住时,只能互斥等待;而这时MVCC可以通过提供历史版本从而实现读取被锁的数据的历史版本,从而避免了互斥等待。InnoDB采用的MVCC实现方式是:在需要时,通过undo日志构造出历史版本。

数据库的几类锁:

共享锁(其他可用但不能改,一般用于读锁),排它锁(其他不能上锁,但没法阻止不上锁的读),行锁(针对索引行),间隙所(针对索引间隙)

增删改都是要加排它锁,只有查select只有显示声明才加锁:

  • select: 即最常用的查询,是不加任何锁的
  • select ... lock in share mode: 会加共享锁(Shared Locks)
  • select ... for update: 会加排它锁

简单理解:数据库的一致性与四种隔离级别(+MySQL实现)的更多相关文章

  1. 数据库事务 ACID属性、数据库并发问题和四种隔离级别

    数据库事务 ACID属性.数据库并发问题和四种隔离级别 数据库事务 数据库事务是一组逻辑操作单元,使数据从一种状态变换到另一种状态 一组逻辑操作单元:一个或多个DML操作 事务处理原则 保证所有事务都 ...

  2. 数据库操作事物的四大特性以及MySQL数据库的四种隔离级别

    1 .事物操作数据库的四大特性(ACID) 1.原子性 (Atomicity) 原子性:就是事物的所包含的所有操作,要么全部成功,要么全部失败回滚. 2.一致性 (Consistency) 一致性:简 ...

  3. MySQL 四种隔离级别

    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...

  4. MySql四种隔离级别

    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...

  5. 面试问烂的 MySQL 四种隔离级别,看完吊打面试官!

    阅读本文大概需要 5.6 分钟. 来源:网络 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操 ...

  6. MySQL 四种隔离级别详解,看完吊打面试官

    转发链接:https://zhuanlan.zhihu.com/p/76743929 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就 ...

  7. MySQL面试题--常见的四种隔离级别

    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...

  8. sql 事务的四种隔离级别

    在 SQL 标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. read unco ...

  9. SQL Server事务的四种隔离级别

    在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. 1.未提交读(Read ...

随机推荐

  1. GitLab Runner部署(kubernetes环境)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. jquery 获取页面和滚动条的高度

    1.获取浏览器显示区域的高度 : $(window).height(); 2.获取浏览器显示区域的宽度 : $(window).width(); 3.获取页面的文档高度 : $(document).h ...

  3. Laytpl 1.2

    https://jeesite.gitee.io/front/laytpl/index.html

  4. 【必读】前端需要懂的 APP 容器原理

    App 容器,简言之,App 承载某类应用(H5/RN/Weex/小程序/Flutter ...)的运行环境,可主动干预并进行功能扩展,达到丰富能力.优化性能.提升体验的目的,如页面数据预取(pref ...

  5. Selenium WebDriver使用

    目录 介绍 selenium webdriver chromedriver下载安装 1.下载 2.使用 3.测试 WebDriver常用操作 1.浏览器操作 2.窗口和弹框操作 3.cookies 操 ...

  6. 使用 Docker 开发 - 使用多阶段构建镜像

    多阶段构建是一个新特性,需要 Docker 17.05 或更高版本的守护进程和客户端.对于那些努力优化 Dockerfiles 并使其易于阅读和维护的人来说,多阶段构建非常有用. 在多阶段构建之前 构 ...

  7. vue安装及创建项目的几种方式

    原文地址:https://www.wjcms.net/archives/vue安装及创建项目的几种方式 VUE安装的方式 直接用 script标签 引入 对于制作原型或学习,你可以这样使用最新版本: ...

  8. 每日一题 - 剑指 Offer 40. 最小的k个数

    题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ...

  9. 【经典DP】洛谷 P2782 友好城市

    嘤嘤嘤,昨天两个文化课老师在上奥赛时招呼我(亲切交流),今天又要写工作报告,没时间写题解,希望今天能补上 友好城市 题目://洛谷那粘来的题面竟然能把格式粘过来 题目描述 有一条横贯东西的大河,河有笔 ...

  10. CF796C Bank Hacking 题解

    洛谷链接 题目 Although Inzane successfully found his beloved bone, Zane, his owner, has yet to return. To ...