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 摘要 企业千万家,靠谱没几家.社招选错家,亲人两行泪. 祝大家金三银四跳槽顺利! 引 ...
随机推荐
- 汇编笔记 RETF
assume cs:code stack segment db 16 dup(0) stack ends code segment start: mov ax,stack;将定义字形数据送入AX mo ...
- hdu 5663 Hillan and the girl 莫比乌斯反演
Hillan and the girl Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/O ...
- review02
位运算符 按为与运算符和按位或运算符都是二目运算符 按位非运算符是单目运算符 按位异或运算符的法则有: a^a=0; a^0=a; a^b^b=a; instanceof是二目运算符,左边的操作是一个 ...
- EF-简化排序
respository.GetPaged<S_Users>(out count, m => m.LoginName.Contains("a"),"Log ...
- 导入工程“The import android cannot be resolved”错误
project - Properties - android 1.Project Build Target 勾选响应的SDK 2.default.properties文件,把target = andr ...
- java重置Timer执行频率
public class BallUtil { public static Timer fisTimer ; public static void fisStartBall(){ long first ...
- 深入浅出Mybatis系列(九)---强大的动态SQL(转载)
原文出处:http://www.cnblogs.com/dongying/p/4092662.html 上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.r ...
- LeetCode OJ:Contains DuplicateII(是否包含重复II)
Given an array of integers and an integer k, find out whether there are two distinct indices i and j ...
- (转)SPFA算法
原文地址:http://www.cnblogs.com/scau20110726/archive/2012/11/18/2776124.html 粗略讲讲SPFA算法的原理,SPFA算法是1994年西 ...
- uva1395 - Slim Span(最小生成树)
先判断是不是连通图,不是就输出-1. 否则,把边排序,从最小的边开始枚举最小生成树里的最短边,对每个最短边用Kruskal算法找出最大边. 或者也可以不先判断连通图,而是在枚举之后如果ans还是INF ...