Sql Server隔离级别(1)
数据库是一个并发操作的环境,就像多线程一样,这样在高并发的情况下回出现一些问题。
假设我们有一张表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)的更多相关文章
- Sql Server隔离级别(2)
Sql Server2005之后,引入了一个新的隔离级别Snapshot(Read Committed Snapshot Isolation (RCSI))和(Snapshot Isolation ( ...
- SQL Server 隔离级别(RC&RR)
- 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- SQL 事务隔离级别
转载来源:https://www.cnblogs.com/chenmh/p/3998614.html 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务 ...
- 【概念原理】四种SQL事务隔离级别和事务ACID特性
摘要: SQL事务隔离级别和事务的ACID特性 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性. 事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UNCOMMITTED.R ...
- (4.12)全面解析-SQL事务+隔离级别+阻塞+死锁
30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 转自:https://blog.csdn.net/slowlifes/article/details/52752735 2016年10月07日 23 ...
- (分享别人的一篇好文章,来自jackson0714)30分钟全面解析-SQL事务+隔离级别+阻塞+死锁()
30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 阅读目录 概述: 一.事务 二.锁 三.阻塞 四.隔离级别 五.死锁 以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQ ...
- 图解 sql 事务隔离级别
sql 事务隔离级别有四种分种为: 一 Read Uncpommitted(未提交读) 二 Read Committed(提交读) 三 Repeated Read(可重复读) 四 Serializab ...
- SQL事物隔离级别
标准SQL定义了4个隔离级别 Read uncommitted 未提交读 Read committed 已提交读 Repeatable read 可重复读 Serializable 可序列化 基本语法 ...
随机推荐
- EL总结
El: 1.el表达式语言(是什么) 2.el是书写到jsp页面 3.el语法格式${ } 4.el算数运算(+,-,*,/,%), 逻辑运算(&&,||,!), 关系运算(>, ...
- NSOperationQueue与GCD的使用原则和场景
首先,我们要明确NSOperationQueue与GCD之间的关系: NSOpertaionQueue用GCD构建封装的,是GCD的高级抽象. 其次,我们要区别两者的不同: GCD仅仅支持FIFO队列 ...
- php类中常量的定义
先看下面一段代码: class SVN { const DEFAULT_PATH = "/tmp"; const SVNLOOK_CMD = "/usr/bin/svnl ...
- CGI
CGI的工作原理一般是这么定义的: 客户端web浏览器浏览某个主页后,利用一定的方式提交数据,并通过HTTP协议向Web服务器发出请求,服务器端的HTTP Daemon(守护进程)将描述的主页信息通过 ...
- Bugtags 实时跟踪插件 - BugtagsInsta
BugtagsInsta 是 Bugtags SDK 的官方插件,应用集成成功后,可以在 Bugtags 云端管理平台实时查看应用的运行时数据:操作步骤.用户数据.控制台日志.Bugtags 日志.网 ...
- #include <objsafe.h>//OCX控件在IE8浏览器下不能使用问题
一.OCX控件开发常见的问题 1.OCX控件在IE8浏览器下不能使用问题 原因:IE8会拦截OCX控件的方法. 解决方法:在OCX控件开发时加入安全接口. (1)在有"Crtl"字 ...
- C++模板机制总结
模板是C++中非常重要的组成部分,之前自己对这块领域一直不太熟悉.最近趁着有时间学习了一下,特此总结. 首先是函数模板,它的定义方式如例子所示: template <typename T> ...
- 超链接实现post方式提交
思路:如果想要超链接实现post方式提交,必须借助表单.下面得两种方式,一种是借助显示的form表单,一种是借助隐式的form表单方式一:将超链接放到一个form表单中,或者超链接本身就在一个form ...
- 黑马程序员_ C语言基础之指针(三)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移 ...
- 一些常用的sql语句
1.查询表里的null值:is null 和 is not null select*from student where email is null 返回的该表里面邮箱为null的结果集 ...