SqlServer——事务—隔离级别
隔离实际上是通过锁来实现的,作用于整个事务,它通常在事务开始前指定,如 SET TRANSACTION ISOLATION LEVEL READ Committed,指定后面的事务为 已提交读;而锁是在我们执行某一具体的SQL语句时在from中指定锁模式来实现的,它可以覆盖掉已指定隔离级别下应用的锁类型。隔离级别牺牲并发性来实现一致性。
并发:是指在相同的时间,多个用户访问相同的数据。它通常引起以下问题:脏读;丢失更新;不可重复度;幻读;
- 脏读:一个进程读取了另一个进程尚未提交的数据。
- 不可重复读:一个进程先后两次读取的数据不相同,若另一个进程在一个进程两次读取的中间修改了数据。
- 幻读:事务在执行过程中进行了两次相同的查询,第二次查询的结果包含了第一次查询未出现的数据或没有第一次查询出现的数据。这是因为在两次查询的执行过程之间,这是因为事务没有对读取的范围进行锁定造成的,在两次查询之间,另外一个事务执行了插入insert或删除delete。
- 更新丢失(Lost Update)。两个进程读取相同的数据,并进行的修改,一个进程会覆盖另一个进程的修改。或两个事务都同时修改同一数据,但第二个事务因发生错误而回滚,导致两次事务的数据修改都丢失了。这是因为系统没有执行任何锁操作,并发的事务没有进行隔离。
事务的隔离级别定义
为了避免事务并发带来的以上问题,按照SQL-99 标准定义,事务的隔离级别有以下几个(隔离性从低到高):
1、未提交读(Read Uncommitted)。允许读取其他事务未提交的数据,即允许脏读,但不允许其他事务同时更新本事务已更新的数据,因此可以避免更新丢失现象。未提交读隔离级别的事务,在更新数据状态时对数据加排他锁,并保持到事务结束;读取器不请求共享锁,处于无锁模式,也就与任何锁无冲突,可以访问被 排它锁 锁定的数据,因此可以读取其他事务尚未提交的更新数据。
2、提交读(Read Committed)。在读取数据时对数据加共享锁,在读取结束后立即释放共享锁,在更新数据状态时对数据加排他锁,并保持到事务结束。因共享锁与排他锁互斥,因此如果其他事务已经修改了数据的状态并未提交,则提交读隔离级别的事务因无法添加共享锁,从而避免读取未提交的数据,可以避免脏读。
3、可重复读(Repeatable Read)。在读取数据时对数据加共享锁,并将共享锁保持到事务结束,在更新数据状态时对数据加排他锁,并保持到事务结束。如果其他事务要修改当前事务已读取的数据时,因为当前事务对已读取的数据保持共享锁,而共享锁与排他锁互斥,导致其他事务无法加排他锁,从而保证事务对于同一数据的读取是可重复的,可避免不可重复读。
4、可串行化(Serializable)。这是最严格的事务隔离级别。在读取数据时,对读取数据的范围加共享锁,并将共享锁保持到事务结束,在更新数据状态时对数据加排他锁,并保持到事务结束。因为是对读取范围加共享锁,将导致其他事务无法对当前事务作用范围内的数据执行操作(更新、插入等),可以避免幻象读现象。范围一般是查询SQL中的where条件指定的。
下面是四种隔离级别下允许的事务并发带来的负作用及区别对照表:
| 隔离级别 | 脏读 | 不可重复读取 | 幻象读 | 区别 |
| 未提交读 | √ | √ | √ |
读取数据(select):无锁状态,可以读取被其他事务的 排它锁 锁定的 未提交 的数据; 更新数据(update):排它锁,保持到事务结束。 |
| 已提交读 | × | √ | √ |
读取数据(select):共享锁,读取完数据立即释放; 更新数据(update):排它锁,保持到事务结束。 |
| 可重复读 | × | × | √ |
读取数据(select):共享锁,保持到事务结束; 更新数据(update):排它锁,保持到事务结束。 |
| 可串行化 | × | × | × |
读取数据(select):对满足筛选器(通常为where条件指定的范围)的数据(包括已存在和 不存在但满足筛选器的)加共享锁,保持到事务结束; 更新数据(update):排它锁,保持到事务结束。 |
示例 1 如下:
(1)新建查询:
set tran isolation level read committed --定义事务隔离级别为 已提交读
begin tran
update student_cj set cj =90 where name ='小虎' and km ='数学'
waitfor delay '00:00:15' --延迟25秒执行
commit
(2)再新建查询:
set tran isolation level read committed
begin tran
select * from student_cj where name ='小明' and km ='数学'
commit
在(1)中,事务被设置为 已提交读 ,意味着在更新(update)中,将获得 排它锁,且该锁将保持到事务结束。而在(2)中由于查询(select)要获得共享锁才能查询,因此要等待15秒直到(1)执行完才可获得共享锁进而才能执行查询。
示例 2 如下:
(1)新建查询:
set tran isolation level read committed --定义事务隔离级别为 已提交读
begin tran
update student_cj set cj =90 where name ='小李' and km ='数学'
waitfor delay '00:00:15' --延迟25秒执行
commit
(2)新建查询
set tran isolation level read uncommitted --定义事务隔离级别为 未提交读
begin tran
select * from student_cj where name ='小李' and km ='数学'
commit
在(1)中,事务被设置为 已提交读 ,意味着在更新(update)中,将获得 排它锁,且该锁将保持到事务结束。而在(2)中为 未提交读, select 无需获取锁即可查询,因此不管(1)中是否有排它锁都不妨碍无锁的查询。
SqlServer——事务—隔离级别的更多相关文章
- Sqlserver事务隔离级别详解
sqlserver存储方式 页 sqlserver是以页的形式存储数据,每个数据页的大小为8KB,sqlserver会把空间分为多个页,sqlserver与数据交互单位最小的io操作就是页级 ...
- SQLServer 事务隔离级别与锁的申请和释放
脏读:当一个事务开始更新数据,但是这个事务并没有完全提交,这个时候第二个事务开始读取数据,把第一个事务所更改的数据读了出来, 第二个事务读取的数据时临时的,因为有可能第一个事务最终有可能做回滚操作 不 ...
- SQLServer 事务隔离级别
MSSQL 事务级别 分类: 数据库2012-12-28 11:17 1050人阅读 评论(0) 收藏 举报 事务 级别 等级优化数据库 一个系统项目做大了,就会遇到性能问题.数据库的优化将是解决性能 ...
- SqlServer中的事务隔离级别、锁机制
事务 作用:用来执行一连串的动作,并且保证所有动作要么都执行.要么都不执行. 属性:原子行.一致性.隔离性.持久性 锁 作用:SqlServer使用锁来实施事务隔离属性. 阻塞 定义:如果一个事务持有 ...
- 【原创】互联网项目中mysql应该选什么事务隔离级别
摘要 企业千万家,靠谱没几家. 社招选错家,亲人两行泪. 祝大家金三银四跳槽顺利! 引言 开始我们的内容,相信大家一定遇到过下面的一个面试场景 面试官:"讲讲mysql有几个事务隔离级别?& ...
- 从事务隔离级别谈到Hibernate乐观锁,悲观锁
数据库的事务,是指作为单个逻辑工作单元执行的一系列操作. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组合为一个要么全部成功要么全部失败的单 ...
- Sql Server中的事务隔离级别
数据库中的事物有ACID(原子性,一致性,隔离性,持久性)四个特性.其中隔离性是用来处理并发执行的事务之间的数据访问控制.SqlServer中提供了几种不同级别的隔离类型. 概念 Read UnCom ...
- 互联网项目中mysql应该选什么事务隔离级别
引言 开始我们的内容,相信大家一定遇到过下面的一个面试场景 面试官:“讲讲mysql有几个事务隔离级别?” 你:“读未提交,读已提交,可重复读,串行化四个!默认是可重复读” 面试官:“为什么mysql ...
- 【转】互联网项目中mysql应该选什么事务隔离级别
作者:孤独烟 转自:https://www.cnblogs.com/rjzheng/p/10510174.html 摘要 企业千万家,靠谱没几家.社招选错家,亲人两行泪. 祝大家金三银四跳槽顺利! 引 ...
随机推荐
- Effective java第一章引言
菜鸟一枚,开始读第一本书<Effective Java>(第二版)~ 看引言就有好多名词不懂(>_<) 导出的API由所有可在定义该API的包之外访问的API元素组成.一个包的 ...
- JavaWeb -- JSP+JavaBean模式
SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. JSP+JavaBean模式适合开发业务 ...
- R树的相关知识
转自:http://blog.csdn.net/houzuoxin/article/details/16113895 R树在数据库等领域做出的功绩是非常显著的.它很好的解决了在高维空间搜索等问题.举个 ...
- AVFoundation之录音及播放
录音 在开始录音前,要把会话方式设置成AVAudioSessionCategoryPlayAndRecord //设置为播放和录音状态,以便可以在录制完之后播放录音 AVAudioSession *s ...
- Spring Boot入门——邮件发送
1.引入依赖 <!-- mail依赖 --> <dependency> <groupId>org.springframework.boot</groupId& ...
- CentOS 6和CentOS 7命令区别
From http://www.cnblogs.com/bethal/p/5945026.html (1)桌面系统[CentOS6] GNOME 2.x[CentOS7] GNOME 3.x(G ...
- C# 6.0 编译器
C# 6.0编译器:可以将csc.exe所在位置 C:\Program Files (x86)\MSBuild\14.0\Bin 添加到Path环境变量. C:\>csc Microsoft ( ...
- 51nod 1243 二分+贪心
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 1243 排船的问题 题目来源: Codility 基准时间限制: ...
- 使用GridSearchCV寻找最佳参数组合——机器学习工具箱代码
# -*- coding: utf-8 -*- import numpy as np from sklearn.feature_extraction import FeatureHasher from ...
- ie-9 以下ajax无法跨域的问题。只要add:jQuery.support.cors=true;即可
if (!jQuery.support.cors && window.XDomainRequest) { var httpRegEx = /^https?:\/\//i; var ge ...