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

假设我们有一张表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. 非阻塞socket调用connect, epoll和select检查连接情况示例

    转自http://www.cnblogs.com/yuxingfirst/archive/2013/03/08/2950281.html 我们知道,linux下socket编程有常见的几个系统调用: ...

  2. jquery 百度搜索

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. 说说Web.Config与App.Config

    说到web.config和app.config大家都很熟悉,我们都叫他们配置文件,平时用的多,注意的少.两个有啥区别呢,很简单,一句话:如果是web程序,如webform项目类型和mvc项目类型就是w ...

  4. 虚拟机拷贝后网卡eth0变成了eth1的解决办法

    一.修改/etc/udev/rules.d/70-persistent-net.rules文件 将之前的eth0那行删了,将eth1改为eth0 二.配置ifcfg-eth0脚本,注意HWADDR那行 ...

  5. CentOS7 修改主机名(转)

    转载出处:http://www.centoscn.com/CentOS/config/2014/1031/4039.html CentOS7 时间同步:http://www.cnblogs.com/r ...

  6. Google公布了禁用Chrome插件后的新解决方案

    chrome://flags/#enable-npapi 启用npapi后重启chrome,再打开 chrome://plugins/

  7. sed字符串替换

    把drivers目录下的所有pr_log替换成:pr_snd sed -i "s/pr_log/pr_snd/g" `grep pr_log -rl drivers/` 把driv ...

  8. HDNOIP201405杨辉三角

    2016.1.27 试题描述 杨辉三角是形如如下的数字三角形: 1 1    1 1   2    1 …… 现在想求出杨辉三角第N行的N个数中,有多少个数能被给定的质数p整除. 输入 一行两个空格隔 ...

  9. Java 之ThreadLocal 对应C#之ThreadStatic

    java: public class JForumExecutionContext { private static ThreadLocal userData = new ThreadLocal(); ...

  10. Flex数据交互之Remoting

    一 前言 Flex数据交互常用的有三种方式:WebService.HttpService以及Remoting. WebService方式已在这篇文章中给出,这篇文章主要讲解以Remoting方式进行数 ...