数据库常见的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. 导出excel文件接口代码示例

    导出excel文件接口代码示例 1.该导出接口,token不能通过请求头来传输,需要在get请求的参数中带出来2.验证token的方法除了在拦截器中统一拦截,针对get接口传参数的方式也需要单独在接口 ...

  2. Django Paginatior分页,页码过多,动态返回页码,页码正常显示

    问题: 当返回数据较多,如设置每页展示10条,数据接近200条,返回页码范围1~20,前端每个页码都显示的话,就会出现页码超出当前页面,被遮挡的页码无法操作和显示不美观: 代码优化: 在使用pagin ...

  3. Kubernetes(K8s)最新版搭建

    Kubernetes简单介绍 Kubernetes意为舵手,简称K8s. 前身是Google的Borg.所以一开源就吸引了一大批注意力. 因为谷歌,所以墙.在国内搭建K8s非常头疼. 下面我就来介绍一 ...

  4. P9482 [NOI2023] 字符串

    \(36pts\) \(O(tqn^2)\)暴力即可 \(40pts\) 对于最朴素的暴力优化,从头到尾扫,如果已经当前位字符比出优先级,那么直接能判断了,没必要往后跑了,第15个性质B的也给跑过了, ...

  5. Linux 内核:设备驱动模型(6)设备资源管理

    Linux 内核:设备驱动模型(6)设备资源管理 背景 不要总是用Linux 2.6的风格来写驱动代码了,也该与时俱进一下. 参考:http://www.wowotech.net/device_mod ...

  6. XIP技术与Flash

    XIP技术与Flash 参考: 串行NAND Flash的两大特性导致其在i.MXRT FLASH控制器下无法XiP norflash芯片内执行(XIP) NOR Flash 和 NAND Flash ...

  7. Linux 驱动需要考虑的同步问题

    --- title: Linux 驱动需要考虑的同步问题 date: 2020-06-22 07:21:32 categories: tags: - ipc - linux - kernel - dr ...

  8. 实测分享,瑞芯微RK3588八核国产处理器性能测评!确实“遥遥领先”!

    RK3588处理器优势 RK3588是瑞芯微最新一代旗舰工业处理器,它具有如下卓越优势: 超强运算能力:四核ARM Cortex-A76@2.4GHz + 四核ARM Cortex-A55@1.8GH ...

  9. P3749 题解

    既然是求最大值而且有收益有代价,所以考虑建立一个最大权封闭子图模型. 收益 正的美味值是收益,所以假若 \(d_{i,j} \geq 0\) 则建边 \((s,pos_{i,j},d_{i,j})\) ...

  10. VulnHub_DC-3渗透流程

    VulnHub_DC-3 DC-3 是另一个特意建造的易受攻击的实验室,旨在获得渗透测试领域的经验. 与之前的 DC 版本一样,这个版本是为初学者设计的,尽管这一次只有一个flag.一个入口点并且根本 ...