说起数据库的隔离方式,首先回答下为啥会有数据库的隔离。提到隔离,那隔离是什么意思呢,简单来说就是你看不见我,我看不见你。比如澡堂里洗澡的时候,通常两个龙头之间会有一个不透明的玻璃墙及一块门帘,两个人洗澡的时候,不用坦诚相对。这个是澡堂里面的隔离,被隔离的对象是两个洗澡的人。那数据库场景的隔离以及被隔离的对象又是什么呢?我们说数据库里面被隔离的对象,是指两个正在准备操作数据库的连接,数据库场景的隔离,其实就是针对这两个连接的隔离。
两个连接为啥要隔离呢?很简单,两个连接都是操作同一个数据库,但是两个连接可能希望彼此之间的操作互不影响。同时,这些连接本身可能正在做一些复杂的事情,比如需要完成同时对数据库完成A,B,C三个操作后,这三步操作成功完成后,才算真正的操作完成。上文中A,B,C三个操作,对连接而言,它希望这三个操作是个整体,要么全部完成,要么完不成。因此需要一个术语,来指代A,B,C三个操作,当然这里也A,B,C只是代指,也有可能是A,B操作,或者A,B,C,D等等,那这个术语就叫做事务。
事务就是操作数据库的逻辑工作单位。基于事务的概念,可能总结出事务的特性,第一,事务是原子的,对外部而言,事务要么成功,要么失败,不需要关心事务内部的一系列相关操作。第二,事务是隔离的,两个连接可以各自开启各自的事务,互不干扰。 第三,事务是持续的,这里的持续是指,事务完成后,因该事务造成数据库的变动是永久的,其改动不随事务的结束而滚回改动前的墨阳。第四,事务执行前后,其状态必须是一致的,怎么定义状态呢,比如A、B两个账号转钱,A给B转100块,转账钱A有100块,B没有钱。转账是个事务,该事务需要先将A的钱扣掉,再将B的钱加上,完成这两步,则事务算是成功的,任何中间状态的失败,该事务都不能成功,不成功的话,再去查数据库的时候,A账户需要依然是100块,B账户需要是0, 成功的话,A账户需要是0,B账户需要是100块。这样才叫前后一致。 一致性需要同原子性,隔离型,持续性来保证。
说了那么多,还是回到中心议题。隔离。 数据库的隔离方式有哪些呢? 通常来说,有四种,即Read uncommitted, read committed, repeatable read, serializable。
Read uncommitted。 拿mysql为例,开两个终端,在终端上开mysql客户端,在Read uncommitted场景下,A, B两个终端同时开启事务, B更新了一条记录但不提交,A直接select的话,能看到B的更新结果, 假设B撤回了提交,对于A来说,除非A重新再select,否则之前的select结果就是脏读,因为读到了一条临时记录。

##A,B两个client均需要执行set autocommit=0;##mysql默认自动提交,需要先关闭set session transaction isolation level read uncommitted;start transaction;##开启事务就是指执行这一条##XX操作;commit;##事务执行完毕的代码

Read committed。 拿mysql为例,开两个终端,在终端上开mysql客户端,在Read committed场景下,A, B两个终端同时开启事务, B更新了一条记录但不提交,A直接select的话,看不到B的更新结果。 假设B提交了结果,A再select,能看到B的提交结果。因此从A的角度,它不知道有个连接B也在操作数据库,所以在A看到,前后执行两遍select,得到的结果不一致

##A,B两个client均需要执行set autocommit=0;##mysql默认自动提交,需要先关闭set session transaction isolation level read committed;start transaction;##开启事务就是指执行这一条##XX操作;commit;##事务执行完毕的代码

Repeatable read。 拿mysql为例,开两个终端,在终端上开mysql客户端,在Repeatable read场景下,A, B两个终端同时开启事务, B更新了一条记录并提交,A在B更新前后执行两次select,查出的结果完全一致,即A当前事务下,不会看到B做的一系列更新。假设B插入一条数据。由于A看不到B的更新,所以A想插入和B相同的插入数据时,会提示记录已存在。此时A就觉得,见了鬼了,我明明查出来没有这条记录。

##A,B两个client均需要执行set autocommit=0;##mysql默认自动提交,需要先关闭set session transaction isolation level read committed;start transaction;##开启事务就是指执行这一条##XX操作;commit;##事务执行完毕的代码

这里提一句, B在事务中,insert之后,但不提交,此时A不能执行insert操作,必须要等B提交完才能操作;B在事务中,如果执行delete,则必须等Acommit,否则会一直等待直到超时。A在事务中,执行select不需要等待,但是执行insert或者update时,必须要等待B commit后,否则一直等待直到超时。 这里insert,delete,update操作需要等,特指A,B针对同一条记录做上述操作时。
Serailizable。 拿mysql为例,开两个终端,在终端上开mysql客户端,在Serailizable场景下,A, B两个终端同时开启事务, A,B做任何操作,均需要等待对方结束事务,否则一直等到超时

##A,B两个client均需要执行set autocommit=0;##mysql默认自动提交,需要先关闭set session transaction isolation level serializable;start transaction;##开启事务就是指执行这一条##XX操作;commit;##事务执行完毕的代码

谈谈数据库的隔离方式相关推荐

  1. 谈谈数据库的ACID

    谈谈数据库的ACID 帅宏军 一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 准备工作:为了说明事务的ACID原理,我们使用银行账户及资金管 ...

  2. 并发编程(四):也谈谈数据库的锁机制

    首先声明,本次文章基本上都是从其他人的文章中或者论坛的回复中整理而来.我把我认为的关键点提取出来供自己学习.所有的引用都附在文后,在这里也就不一一表谢了. 第二个声明,我对于Internel DB并没 ...

  3. Java中JDBC进阶教程之数据库的隔离级别!

    对数据库而言,其明显的特征是资源可以被多个用户共享.当相同的数据库资源被多个用户(多个事务)同时访问时,如果没有采取必要的隔离措施,就会导致各种并发问题,破坏数据的完整性. 如果不考虑隔离性,数据库将 ...

  4. MySQL数据库事务隔离性的实现

    摘要:事实上在数据库引擎的实现中并不能实现完全的事务隔离,比如串行化. 本文分享自华为云社区<[数据库事务与锁机制]- 事务隔离的实现>,原文作者:技术火炬手 . 事实上在数据库引擎的实现 ...

  5. 数据库零碎要点001_数据库的4大特性(原子性_持久性_隔离性_一致性)_数据库的隔离级别(脏读_幻读_不可重复读)_mysql如何设置隔离级别

    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务 ...

  6. 数据库事务隔离发展历史

    本文作者:阿里云数据库技术专家王康. 事务隔离是数据库系统设计中根本的组成部分,本文主要从标准层面来讨论隔离级别的发展历史,首先明确隔离级别划分的目标:之后概述其否定之否定的发展历程:进而引出 Ady ...

  7. 租户隔离怎么做MYSQL_基于JPA实现SaaS多租户模式的数据存储——共享数据库,隔离数据架构...

    SaaS是Software-as-a-Service(软件即服务)的简称,这边具体的解释不介绍.多租户的系统可以应用这种模式的思想,将思想融入到系统的设计之中. 现在SaaS Multi-Tenant ...

  8. 【译】数据库事务隔离级别

    看到wikipedia中文关于数据库相关的几个经典条目有点老旧,尤其和英文条目相比.确定开始翻译其中几篇,先从事务隔离等级开始.格式采用维基Sandbox发布后的格式.翻译完后自己校对过几遍,质量还可 ...

  9. 数据库的隔离级别及相关...

    数据库的隔离级别.锁 要明白隔离级别,得先明白数据库中的事务(Database Transaction) 四个特性: 1. 原子性(atomic)(atomicity) 2. 一致性(consiste ...

最新文章

  1. pymysql模块操作数据库及连接报错解决方法
  2. 提升 Node.js 应用性能的 5 个技巧
  3. 计算机维修工国家职业标准,计算机维修工国家职业标准.pdf
  4. html div box,html – 为转换后的div添加box-shadow
  5. 从bootm 命令讲起/U-boot的环境变量: bootcmd 和bootargs
  6. 高效!Anchor DETR:旷视提出一种基于Transformer的目标检测神器!
  7. pta-4、运算符-找钱 (10 分)
  8. 队列实现max操作,要求尽量提高效率。
  9. 4.性能之巅 洞悉系统、企业与云计算 --- 观测工具
  10. 在 WindowMobile 上的模拟LED 显示屏插件(转)
  11. jquery蝴蝶飞舞网页动画js特效代码
  12. 域名转移记录,从百度云转出至阿里云转入
  13. Safair浏览器 时间戳转化兼容性问题。
  14. Linux用户登录和注销
  15. 基于spring mvc+bootstrap 集成的返利平台 新增内容-自动对接京东数据
  16. Spark动态加载外部资源文件
  17. 如何设置自定义任务栏图标_轻松自定义Windows 7任务栏图标
  18. 转:传智播客—jbpm与OA项目(七)
  19. springBoot使用redis获取自增序号
  20. 微信朋友圈营销快速加好友技巧大全

热门文章

  1. ONEPTP 挂机冲流量 网赚 稳定入帐项目!
  2. 转载 五月的仓颉 的 面试感悟----一名3年工作经验的程序员应该具备的技能
  3. IT是商业的命脉——访HP公司副总裁兼CIO
  4. 名画384 齐白石《画选二十四幅》
  5. 2021年G1工业锅炉司炉考试APP及G1工业锅炉司炉模拟考试软件
  6. android ndk 文件管理,Android NDK 入门与实践
  7. Sysbench常用命令
  8. 网络编程 广播、组播
  9. C++奥特曼打怪兽系列
  10. 兔子数列(斐波那契数列)的优化