首页 > 数据库 >6种 数据库隔离级别中的SNAPSHOT隔离级别

6种 数据库隔离级别中的SNAPSHOT隔离级别

时间:2023-06-19 17:06:49浏览次数:35  
标签:事务 隔离 级别 SNAPSHOT commit 数据


6种 数据库隔离级别中的SNAPSHOT隔离级别_mysql

我估计被吸引到这个文字中的是 6种, 大部分人是想进来看看不是4种吗? 

实际上之前的一段时间,我的认知也是4种隔离级别,这是通过我们的ANSI SQL 表中中定义的 isolation level。

在ANSI/ISO SQL -92 定义了四种隔离级别, RU , RC , RR,  Serializable, 这四种,当然常用的RC,RR,解决了脏读和幻读的问题。ISOLATION的定义一直与数据库系统的性能有关,隔离的级别越低,那么性能就会越好。

而后随着研究的进步,隔离级别进行了分化,延展出另外两种隔离级别

其中一种就是今天要说的 Snapshot  lsolation

今天主要来去重新理解一直在用但其实个人概念并不清楚的 snapshot isolation. 根据官方的文档中提出,snapshot isolation

6种 数据库隔离级别中的SNAPSHOT隔离级别_mysql_02

大致的意思是,当事务读取数据的时候,此时数据的状态是commit的状态,而在读取的时间被命名为 start-timestamp,  在这期间不管是这批数据正在被别的事务处理或者操作, 读取数据的事务的第一次对数据的读取都是不被限制的,在这个snapshot lsolation 中是不会阻止任何对数据的读取的行为。而当其他事务修改了这批数据,则会影响SNAPSHOT LEVEL的中事务对数据的第二次读取,同时对于还未读取这批数据的其他事务来说,刚才我们的start-timestarmp 将失效与还未读取数据的事务。

与RU,RC RR, S ,四种隔离级别强调锁的概念, SNAPSHOT Isolation  强调的是时间对事务的影响。(个人理解)

我们下面画一个图来说明此问题。

6种 数据库隔离级别中的SNAPSHOT隔离级别_数据库_03

以上都是在比较单纯的情况下的非复杂的对SNAPSHOT 的描述

1 事务1 读取了数据集合A (实际上集合A 可能是N 行数据)

2 在读取数据集合A 时, 事务1 会获取一个start_time 来标注操作事务的开始时间。也就是针对这个事务生成SNAPSHOT 的时间。 

3 在经过一段时间后,事务1 要进行commit 此时获得commit时间戳 commit-timestamp , 在提交事务前并未有其他事务对A 数据集合有操作,

则提交顺利完成。

上面的这个图形的问题在没有并发,并且没有多个事务来修改同一个数据集合,那么实际上SNAPSHOT LEVEL 要面临非常复杂的问题,就是 并发和数据的修改同时发生。

那么这里我们需要将问题分析,到底哪些是 SNAPSHOT LEVEL 应该负责的地方。

1  每个事务读取数据的snapshot,snapshot 产生于对这组数据库的copy

2  所有的写操作会被收集到事务的写集合中

3  在提交的时间,所有事务的提交的都会被比较,如果这些提交的信息都是无关联的,则可以直接进行commit;

如果这些信息是有关联的,则根据时间戳的比较来进行数据的commit 通常,commit 时间戳获取早的事务,可以进行commit

 

6种 数据库隔离级别中的SNAPSHOT隔离级别_分布式_04

实际上SNAPSHOT 要解决的问题,

1  读操作时不会陷入block 和死锁的问题中,SNAPSHOT 本身提高了数据库系统的事务处理的性能。

2  避免了  脏读,非一致性读,以及丢失更新,和不可重复读等多个问题

6种 数据库隔离级别中的SNAPSHOT隔离级别_mysql_05

以上是PG 对于SNAPSHOT 部分的代码。

6种 数据库隔离级别中的SNAPSHOT隔离级别_java_06

以上是MYSQL INNODB 操作引起对于SNAPSHOT 的部分代码

那么这里 POSTGRESQL  和MYSQL  在实现SNAPSHOT 功能中,老的数据版本分表存在表本体和UNDO LOG中, 同时对于SNAPSHOT 的力度都是针对 tuple 和  row,  而时间戳都包含在各自的事务记录中。

总结:

SNAPSHOT LEVEL 解决了锁解决了的事务隔离级别和性能之间的矛盾问题,有效的提高了数据库并发的性能问题。

但在分布式数据库系统中,SNAPSHOT 又有了新的挑战,时间(timestamp)还是解决问题的核心。

6种 数据库隔离级别中的SNAPSHOT隔离级别_数据库_07

标签:事务,隔离,级别,SNAPSHOT,commit,数据
From: https://blog.51cto.com/u_14150796/6515974

相关文章

  • 代理模式实现隔离层架构,自由切换三方网络请求框架
    使用代理模式实现隔离层架构,目的是为了当出现一个新的网络框架的时候,可以在业务层无感的情况下自由切换网络库,实现热插拔,对业务层几乎没有影响。1架构图以用户租房为例,租户相当于APP的业务层;一个用户会对比多套房子,所以会有多个房东,最终提供房源的是房东,所以房东就类似最终实现网......
  • DC-DC电源模块直流隔离升压变换器高压稳压输出50V/110V/130V/150V/220V/250V/300V/500
    HRB系列隔离宽电压输入高电压稳压输出特点●效率高达 80%以上●1*2英寸标准封装●单电压输出●价格低●稳压输出●工作温度:-40℃~+85℃●阻燃封装,满足UL94-V0要求●温度特性好●可直接焊在PCB上应用HRBW2~40W系列模块电源是一种DC-DC升压变换器。该模块电源的输入......
  • 【后端面经-数据库】MySQL的事务隔离级别简介
    (【后端面经-数据库】MySQL的事务隔离级别简介)0.事务的概念事务指的是一连串的集中操作指令,一个事务的执行必须执行完所有的动作才能算作执行结束。事务具有四个特点,简记作ACID:A-Atomicity:原子性,事务的执行必须保证所有的动作都执行完毕;C-Consistency:一致性,事务的执行必......
  • 【后端面经-数据库】MySQL的事务隔离级别简介
    目录0.事务的概念1.三类问题2.事务隔离级别3.操作指令4.总结5.参考博文0.事务的概念事务指的是一连串的集中操作指令,一个事务的执行必须执行完所有的动作才能算作执行结束。事务具有四个特点,简记作ACID:A-Atomicity:原子性,事务的执行必须保证所有的动作都执行完毕;C-Co......
  • java开发系统内核:应用程序与系统内核的内存隔离
    当前,我们可以开发运行在系统上的应用程序了,接下来的问题是如何保护系统内核免受恶意应用程序的危害。恶意程序要想侵犯系统,主要路径有两条,一是让内核执行它的代码,而是修改内核数据,通过修改数据改变内核的行为。我们看看,如何预防恶意程序侵入到系统内核的数据区域中。无论是内核还是......
  • 远程线程注入之突破Session0隔离会话
    前言当我们使用远程线程注入将dll注入至系统服务进程中往往会失败,这是因为大多数系统服务都是在Session0中运行的"Session0"是Windows操作系统中的一个特殊的会话,专门用于运行系统服务和其他在用户登录之前就需要运行的程序。从WindowsVista和WindowsServer2008开始,为了提高......
  • DC-DC电源稳压模块直流隔离高压输出升压变换器5v12v24v转50v110v80v250v310v400v500v
    HRB系列隔离宽电压输入高电压稳压输出特点 效率高达80%以上 1*1英寸标准封装 单电压输出 稳压输出 工作温度:-40℃~+85℃ 阻燃封装,满足UL94-V0要求 温度特性好 可直接焊在PCB上应用HRB0.2~10W系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为:4.5~9V、9......
  • java——微服务——spring cloud——Nacos——Nacos环境隔离——namespace
              ===========================================================================================              ......
  • 45 最佳实践-性能最佳实践-kworker隔离绑定
    45最佳实践-性能最佳实践-kworker隔离绑定45.1概述kworker是Linux内核实现的per-CPU线程,用来执行系统中的workqueue请求。kworker线程会和vCPU线程争抢物理核资源,导致虚拟化业务性能抖动。为了使虚拟机能够稳定的运行,减少kworker线程对虚拟机的干扰,可以将主机上的kworker线程绑......
  • .locked加密勒索数据库级别恢复---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:.locked加密勒索数据库级别恢复作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]有客户数据库被加密成.locked结尾的扩展名,数据库无法正常使用对应的READ_ME1.html文件中信息类似:s......