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 摘要 企业千万家,靠谱没几家.社招选错家,亲人两行泪. 祝大家金三银四跳槽顺利! 引 ...
随机推荐
- 用TinyXml做XML解析示例 TinyXml查找唯一节点及修改节点操作
// 读者对象:对TinyXml有一定了解的人.本文是对TinyXml工具的一些知识点的理解. // 1 TinyXml中对TiXmlNode进行了分类,是用一个枚举进行描述的. // enum No ...
- Codeforces Round #280 (Div. 2) D. Vanya and Computer Game 数学
D. Vanya and Computer Game time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- Struts2架构流程
[Struts2] Action实现. interceptor实现. Filter工作原理. 使用 拦截器来处理请求. 业务逻辑控制器与 Servlet API分离. ================ ...
- java 如何保证接口的安全性
在开发过程中,肯定会有和第三方或者app端的接口调用.在调用的时候,如何来保证非法链接或者恶意攻击呢? 1.签名 根据用户名或者用户id,结合用户的ip或者设备号,生成一个token.在请求后台,后台 ...
- 利用CocoaLumberjack框架+XcodeColors插件,调试输出有彩色的信息
效果如下: 步骤: 1. 安装Xcode插件:XcodeColors(方法请参考这里) 2. 为项目添加 CocoaLumberjack 框架(方法请参考这里) 3. 添加代码 (1) 为项目添加 p ...
- linux IP局域网监控工具——iptraf
iptraf iptraf是一款交互式.色彩鲜艳的IP局域网监控工具.它可以显示每个连接以及主机之间传输的数据量.下面是屏幕截图. $ sudo iptraf 安装iptraf: # Centos(基 ...
- linux服务器版svn安装
1.检查svn是否安装:rpm -aq subversion2.安装命令yum -y install subversion3.建立svn版本库数据存储根目录mkdir -p /application/ ...
- android不同的按钮一起点击崩溃解决
public class ButtonUtils { private static long lastClickTime; public synchronized static boolean isF ...
- 2 Python 基本语法
编译型与解释型. 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释成机器语言给 ...
- 浅学soap--------1
无wsdl文件: Clint.php //客户端 <?php $soap = new SoapClient(null,array('uri'=>'server','location'=&g ...