数据库是一个并发操作的环境,就像多线程一样,这样在高并发的情况下回出现一些问题。

假设我们有一张表Account,表结构和数据如下所示

AccountName Balance
jo 100
fo 200

假设我们有两个事事务(T1,T2)

脏读:当一个事务允许读取另外一个事务修改但未提交的数据时,就可能发生脏读(dirty reads)。

(1)T1更新jo的余额:

UPDATE Account SET Balance=500 WHERE AccountName='jo'

(2)T2选出jo的余额:

SELECT Balance FROM Account WHERE AccountName='jo'

(3)T1回滚(rollback)。

此时在(2)中已经选出了500这个值,尽管最后T1的回滚让jo的余额保持100没有改变,这种情况就是脏读。

不可重复读:在一次事务中,当一行数据获取两遍得到不同的结果表示发生了"不可重复读(non-repeatable read)"。

(1)T2选出jo的余额:

SELECT Balance FROM Account WHERE AccountName='jo'

(2)T1中更新jo的余额并且提交(commit)。

UPDATE Account SET Balance=500 WHERE AccountName='jo'
Commit Tran

(3)T2再次选出jo的余额

SELECT Balance FROM Account WHERE AccountName='jo'

此时在(1)中选出的余额是100,在(3)中选出的余额是500,在同一个事务T2中两个Select得到了不一样的数据。

幻读:在事务执行过程中,当两个完全相同的查询语句执行得到不同的结果集。这种现象称为“幻读(phantom read)”

(1)T2选择金额大于100的账户余额

SELECT Balance FROM Account WHERE Balance>100

(2)T1插入新的余额大于100的账户

INSERT INTO Account (AccountName,Balance) VALUES ('ho',300)

(3)T2中再次选择金额大于100的账户

SELECT Balance FROM Account WHERE Balance>100

此时(1)读出了一条数据,(2)读出了两条数据,同一个查询的在同一个事务中的两次读取得到了不同的数量的结果集,这种现象就是幻读。

为了处理以上并发问题,有了并发控制的概念。简单来说就是一个事务在执行的时候,通过对正在访问的资源加锁来阻塞其他事务对资源的操作。

不同的加锁方式对应不同的隔离级别,用来针对不同的并发问题。

READ UNCOMMITTED

事务执行期间,对任何操作不加锁。意味着可以读取其他事务未提交的更新。这个隔离级别下以上的并发问题都有可能发生。

READ COMMITTED

事务执行期间,对写操作加锁。意味着当前将要写入的数据加了写锁,阻塞其他事务读取或者更改加锁数据,直到事务结束。

这个隔离级别可以防止其他的事务脏读,因为其他的事务对加锁数据的读写操作都被当前事务阻塞了。不过由于当前事务没有加读锁,所以当前事务会发生不可重复读。

REPEATABLE READ

事务执行期间,对读,写操作加锁。意味着当前事务写入和读取的数据其他的事务都无法访问,知道当前事务结束(回滚,或者提交),当前事务不会发生不可重复读,不过由于当前读取的数据范围没有加锁,其他的事务可以插入满足当前事务读取范围过滤条件的数据;或者更新当前事务读取范围外的数据,已使其满足当前事务的读取范围过滤条件。这样就会造成幻读。

SERIALIZABLE

可序列化或者叫可串行化,按照字面意思,是事务只能一个接着一个的执行。

实际的实现方式是通过加读锁,写锁和范围锁来保证事务执行的串行化。意味着在当前事务的执行过程中,会阻塞其他的涉及当前事务相关数据及数据范围的事务。

本文只是一个简单的介绍,要完全的理解隔离级别,并且推断出事务在不同隔离级别下会有什么样的不同就要深入的了解SQL Server在不同隔离级别下对不同对象的锁定,以及不同的锁之间是如何交互的,这些方面的问题推荐下面这篇博客:

http://www.cnblogs.com/RicCC/archive/2010/03/05/transaction-lock-isolation-level.html

Sql Server隔离级别(1)的更多相关文章

  1. Sql Server隔离级别(2)

    Sql Server2005之后,引入了一个新的隔离级别Snapshot(Read Committed Snapshot Isolation (RCSI))和(Snapshot Isolation ( ...

  2. SQL Server 隔离级别(RC&RR)

  3. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  4. SQL 事务隔离级别

    转载来源:https://www.cnblogs.com/chenmh/p/3998614.html 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务 ...

  5. 【概念原理】四种SQL事务隔离级别和事务ACID特性

    摘要: SQL事务隔离级别和事务的ACID特性 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性.   事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UNCOMMITTED.R ...

  6. (4.12)全面解析-SQL事务+隔离级别+阻塞+死锁

    30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 转自:https://blog.csdn.net/slowlifes/article/details/52752735 2016年10月07日 23 ...

  7. (分享别人的一篇好文章,来自jackson0714)30分钟全面解析-SQL事务+隔离级别+阻塞+死锁()

    30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 阅读目录 概述: 一.事务 二.锁 三.阻塞 四.隔离级别 五.死锁 以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQ ...

  8. 图解 sql 事务隔离级别

    sql 事务隔离级别有四种分种为: 一 Read Uncpommitted(未提交读) 二 Read Committed(提交读) 三 Repeated Read(可重复读) 四 Serializab ...

  9. SQL事物隔离级别

    标准SQL定义了4个隔离级别 Read uncommitted 未提交读 Read committed 已提交读 Repeatable read 可重复读 Serializable 可序列化 基本语法 ...

随机推荐

  1. modelsim操作流程

    1.File->Change Directory2.File->New->Library 在弹出的对话框中选择 a new library and a logical mapping ...

  2. STM32F4读写内部FLASH【使用库函数】

    STM32F4Discovery开发帮使用的STM32F407VGT6芯片,内部FLASH有1M之多.平时写的代码,烧写完之后还有大量的剩余.有效利用这剩余的FLASH能存储不少数据.因此研究了一下S ...

  3. mint安装相关数据库lib

    sudo apt-get install libmysqlclient-dev sudo apt-get install sqlite3 libsqlite3-dev

  4. 开启win7系统关闭日志分析

    笔记本突然没有任何征兆的自动重启了,想起之前曾经在网上看过通过系统日志查看一下是哪个东东搞的鬼,于是开始上网搜索,发现默认情况下是关机的信息记录的很少,不过可以开启审计功能来记录这个捣鬼的程序.于是就 ...

  5. requestWindowFeature(Window.FEATURE_NO_TITLE)无效解决方法

    今天在<第一行代码>上学习做自定义标题栏,需要将系统自带的标题栏隐藏掉,使用自定义的标题栏,结果发现,requestWindowFeature(Window.FEATURE_NO_TITL ...

  6. VBA_Excel_教程:单元格颜色

    Sub SetCellColor() '设置单元格颜色 Sheet1.Cells(, ).Interior.ColorIndex = End Sub

  7. MongoDB常用操作

    (备注: 对于 window, 不需要sudo) 验证成功与否: * 启动服务器: $sudo mongod --dbpath C:\data\db (需要 指明数据库存放的目录) * 打开shell ...

  8. iPad 控件 UIPopoverPresentationController 使用 iPhone可用

    UIPopoverController 在iOS9之后被废弃了,,, iOS8 新控件UIPopoverPresentationController可运用在iphone和iPad上,使用基本同 UIP ...

  9. js实现图片无缝连接

    效果图 1.首先先看看html和css代码 <style> *{padding:0;margin:0;} #div1{margin:100px auto;background:red;wi ...

  10. docker理念:不可变基础设施

    不可变基础设施 1.什么是Immutable Infrastructure Immutable Infrastructure,直译过来就是不可变基础设施. 它是由Chad Fowler于2013年提出 ...