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 摘要 企业千万家,靠谱没几家.社招选错家,亲人两行泪. 祝大家金三银四跳槽顺利! 引 ...
随机推荐
- 搭建confluence参考文献
https://www.cnblogs.com/kevingrace/p/7607442.html https://yq.aliyun.com/articles/144747?t=t1 jira: h ...
- python中的import一个注意事项
import math def foo(): import math x = math.pi # 如果math在下面import会出错,因为import是个写的过程(添加到sys.modules中), ...
- Ubuntu linux背景指南:在开始之前需要知道哪些东西
1.摘要 Ubuntu是一个新的GNU/Linux衍生操作系统,其目标是更多地以用户为本以及桌面应用. 因此,Ubuntu的目的是消除安装的困难,在很大程度上靠自动配置和自动探测硬件解决 问题,无须用 ...
- 一款简易的CSS3扁平化风格联系表单
CSS3扁平化风格联系表单是一款CSS3简易联系表单非常清新,整体外观不是那么华丽,但是表单扁平化的风格让人看了非常舒服,同时利用了HTML5元素的特性,表单的验证功能变得也相当简单.经测试效果相当不 ...
- 关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题。
转:关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题. 关于JSONObje ...
- 【疯了Labview】(一)仿JKI的RCF 挂件
最近在疯狂的学习C#中,学习的最好的一个途径便是论坛,发帖,看帖和被骂,新手往往在这个过程中慢慢长大一直想做个类似JKI RCF挂件的东西,目前实现了,想想其实思路也不是很难, RCF是JKI做的通过 ...
- jQuery实现表格冻结行和列
前几天,遇到一个需求是要将表格的前几行和前几列冻结即固定,就是在有滚动条的情况下,保持那几行和那几列固定,这个需求其实是一个非常常见的需求,因为在涉及好多行和列时,在拖动滚动条时,我们需要知道每行每列 ...
- hdu 5243 Homework
Homework Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 18 Python 模块引入
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python 代码段. 把相关的代码 ...
- 分布式_理论_08_Consistent Hash(一致性哈希算法)
一.前言 五.参考资料 1.分布式理论(八)—— Consistent Hash(一致性哈希算法)