数据库常见的4种事务隔离级别:

(源自:(34条消息) 8. 事务隔离级别: 总结_oyw5201314ck的博客-CSDN博客_ck事务隔离

大多数的数据库默认的事务隔离级别是Repeatable-Read或Read-Committed。

关于数据库的事务隔离级别有两个博主的博客写的比较容易懂,给出如下:

第一个博主:

1. 事务隔离级别之Read Uncommitted

2. 事务隔离级别之Read Committed

3. 事务隔离级别之Repeatable Read

4. 事务隔离级别之Serializable

第二个博主:

1. Read Uncommitted

3. Repeatable Read

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时,其执行事务时会阻塞其他并发事务,从上面的错误信息中我们也可以看出应该是通过某种锁来实现的。既然是这样,那么“脏读”、“不可重复读”和“幻读”自然是不可能发生了。

(源自:

1. 事务隔离级别之Read Uncommitted

2. 事务隔离级别之Read Committed

3. 事务隔离级别之Repeatable Read

4. 事务隔离级别之Serializable

 
 

=====================================

 
 
关于Snapshot Islation的实现原理,见:
隔离级别--read committed and snapshot isolation - 知乎 (zhihu.com)
 
其中给出了解释:
Snapshot isolation,即每个事务从数据库的快照读取数据,事务可以看到在此事务开始前提交的所有数据,即便某些数据之后被修改了,每个事务只读取修改前的旧的数据版本。
 
 

上面虽然给出了四种事务隔离的级别,但都是关于读的问题,而事务并行写时往往会有 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的更多相关文章

  1. 数据库的快照隔离级别(Snapshot Isolation)

    隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而不会影响写操作申请的互斥锁(Exclusive Lock),隔离级 ...

  2. 转:数据库的快照隔离级别(Snapshot Isolation)

    数据库的快照隔离级别(Snapshot Isolation)   隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而 ...

  3. 对snapshot isolation和write-snapshot isolation的一些思考

    数据库中存在读异常和写异常. 所谓snapshot,目的在于保证事务执行的各个阶段,读相同的数据项得到的结果没有变化,这样一来就避免了不可重复读.幻读等读数据异常. 但是仅仅是读数据不变还不够,因为这 ...

  4. In-Memory:内存优化表的事务处理

    内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...

  5. Microsoft SQL Server中的事务与并发详解

    本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...

  6. Expert 诊断优化系列------------------给TempDB 降温

    前面文章针对CPU.内存.磁盘.语句.等待讲述了SQL SERVER的一些基本的问题诊断与调优方式.为了方便阅读给出导读文章链接方便阅读: SQL SERVER全面优化-------Expert fo ...

  7. SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

  8. Azure SQL Database Active Geo-Replication简介

    笔者在<迁移SQL Server 数据库到 Azure SQL 实战>一文中,介绍了如何把一个本地版的 SQL Server 数据库迁移到 Azure SQL Database.迁移虽然顺 ...

  9. Optimistic Concurrency VS. Pessimistic Concurrency Control

    原创地址:http://www.cnblogs.com/jfzhu/p/4009918.html 转载请注明出处   (一)为什么需要并发控制机制 并发控制机制是为了防止多个用户同时更改同一条数据,也 ...

  10. EntityFramework之异步、事务及性能优化(九)

    前言 本文开始前我将循序渐进先了解下实现EF中的异步,并将重点主要是放在EF中的事务以及性能优化上,希望通过此文能够帮助到你. 异步 既然是异步我们就得知道我们知道在什么情况下需要使用异步编程,当等待 ...

随机推荐

  1. 在线Token、随机密码生成工具

    在线生成自定义长度,包含大写或小写字母.数字或符号的随机字符串.无论你需要生成API访问令牌.账户激活令牌,还是随机密码字符串,它都能帮你快速完成. 在线Token.随机密码生成工具

  2. linux nginx命令 查找目录和重启

    #查看nginx进程 [root@LinuxServer]$ps -aux | grep nginx root 3229 0.0 0.0 112812 972 pts/0 S+ 16:50 0:00 ...

  3. 博客更换新域名为52ecy.cn

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 博客更换新域名为52ecy.cn 日期:2017-10-2 ...

  4. 20-Docker镜像制作

    查看镜像构建的历史 docker image history 26a5 #查看镜像26a5的构建历史 使用commit命令构建镜像 使用commit命令可以将容器构建成镜像. 将容器webserver ...

  5. 使用getevent在Android中调试输入子系统

    # Android getevent用法详解 背景 在调试安卓设备按键,想使用hexdump,但是发现没有找到,反而找到了这个更好用的工具. 以下是我的调试片段 # getevent -l /dev/ ...

  6. 『vulnhub系列』EVILBOX-ONE

    『vulnhub系列』EVILBOX-ONE 下载地址: https://www.vulnhub.com/entry/evilbox-one,736/ 信息搜集: 使用nmap探测内网存活主机,发现开 ...

  7. C#的多线程UI窗体控件显示方案 - 开源研究系列文章

    上次编写了<LUAgent服务器端工具>这个应用,然后里面需要新启动一个线程去对文件进行上传到FTP服务器,但是新线程里无法对应用主线程UI的内容进行更改,所以就需要在线程里设置主UI线程 ...

  8. AJAX基础+Axios快速入门+JSON使用+综合案例

    目录 1. AJAX 1.1 概述 1.1.1 作用 1.1.2 同步和异步 1.2 快速入门 1.2.1 服务端实现 1.2.2 客户端实现 1.3 案例 1.3.1 需求 1.3.2 分析 1.3 ...

  9. Nginx性能调优5招35式不可不知的策略实战

    Nginx是一个高性能的HTTP和反向代理服务器,它在全球范围内被广泛使用,因其高性能.稳定性.丰富的功能以及低资源消耗而受到青睐.今天V哥从5个方面来介绍 Nginx 性能调优的具体策略,希望对兄弟 ...

  10. Java 、C# Excel模板,数据一对多,主从表关系,导入到数据库

    思路 单表导入的比较容易,但是有的时候,可能会出现,一对多数据导入的,这个情况怎么办呢?先理解上面的图,后台获取数据的时候,除了"风险防控措施"外,其他字段先分组,"黄色 ...