什么是snapshot isolation
数据库常见的4种事务隔离级别:
(源自:(34条消息) 8. 事务隔离级别: 总结_oyw5201314ck的博客-CSDN博客_ck事务隔离)
大多数的数据库默认的事务隔离级别是Repeatable-Read或Read-Committed。
关于数据库的事务隔离级别有两个博主的博客写的比较容易懂,给出如下:
第一个博主:
第二个博主:
4. Serializable
这里也对这四种事务隔离级别说下个人的理解。总的说下,这四种级别其实都是针对多事务并行时的读操作的。
read uncommited是指一个事务在读某个数据时该数据已被另一个事务更新过,但是另一个事务还没有提交,此时该事务读取的值为另一个事务更新后的值,如果此时另一个事务回滚的话,那么这个事务读取到的数据变为脏数据;
read commited是指一个事务在读某个数据时这个数据可能被另一个事务更新过并已提交,那么在这个事务的多次查询中可以读取到的不同数值的该数据,因此不可避免重复读;
repeatable read是指一个事务在读某个数据时不受其他事务对这个数据的更新的影响,但是如果某数据不存在而其他事务插入了某数据,那么在这个事务中也是可以查询到这个数值的,而且事务本身对某个数据的插入和更新也是可以被被本事务所查询到的,尤其要注意由于repeatable read级别的事务隔离一般都是使用snapshot isolation方式来实现的,因此很多地方把repeatable read叫做snapshot isolation,repeatable read可以避免重复读但是无法避免幻读;
serializable可以看做是串行方式运行事务的,一个事务运行结束才可以运行其他事务,该种串行方式可以避免脏读、重复读、幻读。
解释一下脏读、重复读、幻读的个人理解:
脏读是指一个事务读到的数据是错误的,不是数据库中真正存在的数值,因为读到的数值被其他事务回滚,因此该数据是错误的。正如read uncommited级别无法避免脏读一样,脏读的原因就是一个事务可以读取到另一个事务还没有提交的数据。
重复读是指一个事务重复的多次读同一个数据会获得不同的数值,其产生的原因和read commited级别一样,是因为一个事务会读取到另一个事务提交的数值,或者说一个事务对某个数据的查询会受其他事务的提交所影响。
幻读是指一个事务多次查询某个数据时会读取到其他事务插入的数据。repeatable read虽然可以保证一个事务多次读取一个存在的数据时会获得相同结果,但是不能保证多次查询的结果会因为读到之前不存在的数据行(被其他事务插入的)而不同。
脏读(dirty reads)是指读到了错误的数据。
不可重复读, 也即一个事务范围内两个相同的查询却返回了不同数据。
幻读,也即在一次事务范围内多次进行查询,如果其他并发事务中途插入了新的记录,那么之后的查询会读取到这些“幻影”行。不可重复读对应的是修改即Update,幻读对应的是插入即Insert。
隔离级别为Serializable时,其执行事务时会阻塞其他并发事务,从上面的错误信息中我们也可以看出应该是通过某种锁来实现的。既然是这样,那么“脏读”、“不可重复读”和“幻读”自然是不可能发生了。
(源自:)
=====================================
上面虽然给出了四种事务隔离的级别,但都是关于读的问题,而事务并行写时往往会有 Lost Updates 和 Write Skew 问题。隔离级别--read committed and snapshot isolation - 知乎 (zhihu.com)对这两个问题解释的不是很形象,于是结合一下(34条消息) 写偏斜(Write Skew)和丢失更新(Lost Updates)区别_软件工程小施同学的博客-CSDN博客会更加清晰。
可以说lost updates是指多个事务对某个数据进行先读后写的操作时存在后提交的事务覆盖掉先提交的事务对该数据的修改,导致先提交的事务进行的update丢失;write skew是指事务A读取某数据XXX,然后根据XXX计算出数据YYY的数值,但是在YYY数值写入数据库之前(也就是在事务A进行commit之前),事务B对数据XXX进行了修改并完成提交(执行了commit操作),这样所造成的不一致性叫做write skew。
=====================================
参考:
隔离级别--read committed and snapshot isolation - 知乎 (zhihu.com)
(34条消息) 写偏斜(Write Skew)和丢失更新(Lost Updates)区别_软件工程小施同学的博客-CSDN博客
什么是snapshot isolation的更多相关文章
- 数据库的快照隔离级别(Snapshot Isolation)
隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而不会影响写操作申请的互斥锁(Exclusive Lock),隔离级 ...
- 转:数据库的快照隔离级别(Snapshot Isolation)
数据库的快照隔离级别(Snapshot Isolation) 隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而 ...
- 对snapshot isolation和write-snapshot isolation的一些思考
数据库中存在读异常和写异常. 所谓snapshot,目的在于保证事务执行的各个阶段,读相同的数据项得到的结果没有变化,这样一来就避免了不可重复读.幻读等读数据异常. 但是仅仅是读数据不变还不够,因为这 ...
- In-Memory:内存优化表的事务处理
内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...
- Microsoft SQL Server中的事务与并发详解
本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...
- Expert 诊断优化系列------------------给TempDB 降温
前面文章针对CPU.内存.磁盘.语句.等待讲述了SQL SERVER的一些基本的问题诊断与调优方式.为了方便阅读给出导读文章链接方便阅读: SQL SERVER全面优化-------Expert fo ...
- SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- Azure SQL Database Active Geo-Replication简介
笔者在<迁移SQL Server 数据库到 Azure SQL 实战>一文中,介绍了如何把一个本地版的 SQL Server 数据库迁移到 Azure SQL Database.迁移虽然顺 ...
- Optimistic Concurrency VS. Pessimistic Concurrency Control
原创地址:http://www.cnblogs.com/jfzhu/p/4009918.html 转载请注明出处 (一)为什么需要并发控制机制 并发控制机制是为了防止多个用户同时更改同一条数据,也 ...
- EntityFramework之异步、事务及性能优化(九)
前言 本文开始前我将循序渐进先了解下实现EF中的异步,并将重点主要是放在EF中的事务以及性能优化上,希望通过此文能够帮助到你. 异步 既然是异步我们就得知道我们知道在什么情况下需要使用异步编程,当等待 ...
随机推荐
- 16-Docker核心概念
Docker镜像 Docker 镜像类似于操作系统镜像,可以将它理解为一个只读的模板. 例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了Apache应用程序,可以把它称为一个Apache镜像 ...
- python重拾第十二天-sqlalchemy ORM
本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM介绍 orm英文全称object relational mapping ...
- nginx web服务器应用(虚拟主机 日志 rewrite location https)
Nginx介绍 Nginx是一个开源的,支持高性能,高并发的www服务和代理服务软件,因具有高并发(特别是静态资源),占用系统资源少等特性,且功能丰富而逐渐流行起来.功能应用上,Nginx不但是一个优 ...
- Springboot+Shiro+Mybatis+mysql实现权限安全认证
Shiro是Apache 的一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.Shiro 主要分为两个部分就是认证和授权两部分 一.介绍 Subject代表了当前用户的安全操作 ...
- Linux开机启动自定义脚本
方式一:chkconfig命令 首先编写好自启的脚本 /etc/init.d/test.sh #!/bin/sh # chkconfig: 2345 10 90 # 创建个文件 touch /opt/ ...
- Mybatis ResultMap复杂对象一对一查询结果映射之association
Mybatis复杂对象映射配置ResultMap的association association:映射到POJO的某个复杂类型属性,比如订单order对象里面包含user对象 表结构 项目结构 pom ...
- h5使用js拉起微信支付
近期,业务需求对接了微信支付,做个总结.web网页想要拉起微信支付,有两种方法: H5下单支付 , JSAPI支付 .首先纯前端做不了微信支付,必须配合后端才能通过微信的下单请求.接下来说说这两种方法 ...
- [oeasy]python0089_大型机的衰落_Dec小型机崛起_PDP_VAX网络
编码进化 回忆上次内容 上次 回顾了 计算机存储单位的演变 最小的读写单位 是 bit 8-bit 固定下来 成为了字节(Byte) 位数 容量 8-bit 1Byte 1024Byte 1 KB 1 ...
- c++17 structure binding test
1 /*test for struct binding*/ 2 3 #include <string> 4 #include <iostream> 5 using namesp ...
- 业务场景---Token无感刷新
业务场景描述 假设用户正在填写一个复杂的表单,由于表单内容繁多,用户花费了很长时间才填完.这时,如果Token已经过期,系统会让用户重新登录,这种体验显然是非常糟糕的.为了避免这种情况,我们需要在To ...