SQL Server事务的隔离级别

########## 数据库中数据的一致性 ##########

针对并发事务出现的数据不一致性,提出了4个级别的解决方法:

 隔离级别  第一类丢失更新  脏读 不可重复读  第二类丢失更新  虚读
 未提交读  未发生  发生  发生  发生  发生
 提交读  未发生  未发生  发生  发生  发生
 可重复读  未发生  未发生  未发生  未发生  发生
 串行化  未发生  未发生  未发生  未发生  未发生

1.未提交读

采用排它锁(update, insert, delete),解决了丢失更新问题,但是脏读仍然会出现。

例1:

begin tran

update t1 set t1.name = 'yyy'

waitfor delay '00:00:10' --等待10秒

rollback tran

例2:

set transaction isolation level read uncommitted

begin tran

select * from t1

commit tran

结果:例2返回更新后的值(yyy),尽管最后更新回滚了。

2.提交读

采用共享锁(select)+排它锁(update, insert, delete),解决了丢失更新问题,也解决了脏读问题。SQL Server默认属于这个隔离级别。

3.可重复读

采用修改锁(update)+排它锁(insert, delete)+共享锁(select),解决了丢失更新问题,脏读问题,但是会出现幻像读。

例3:

set transaction isolation level repeatable read

begin tran

select * from t1

waitfor delay '00:00:10'

select * from t1

commit tran

例4:

set transaction isolation level repeatable read

begin tran

delete from t1 where t1.id = 8

commit tran

结果:例3,2次返回的结果集都一样,都含有t1.id=8的行。

4.可串行读

采用一个事务执行完后,才能执行第2个事务(被阻塞)的串行方式,解决了以上所有的问题。

例5:

set transaction isolation level serializable

begin tran

select * from t1

waitfor delay '00:00:10'

commit tran

例6:

set transaction isolation level serializable

begin tran

delete from t1 where t1.id = 9

commit tran

结果:例5,2次都返回一样的结果,是删除前的。只能说明实现了可重复读级别的事务。

例7:

set transaction isolation level serializable

begin tran

select * from t1

waitfor delay '00:00:10'

select * from t1

commit tran

例8:

set transaction isolation level serializable

begin tran

insert into t1(name) values('zhang')

commit tran

结果:例7,2次都返回一样的结果,都是添加前的结果集。结合前面的例子说明是串行级别。

SQL Server事务的隔离级别的更多相关文章

  1. SQL Server事务的隔离级别和锁

    背景        当用户并发尝试访问同一数据的时,SQL Server尝试用锁来隔离不一致的数据和使用隔离级别查询数据时控制一致性(数据该如何读取),说起锁就会联想到事务,事务是一个工作单元,包括查 ...

  2. SQL Server事务、隔离级别详解(二十九)

    前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...

  3. SQL Server 事务与隔离级别实例讲解

    上班途中,你在一处ATM机前停了下来.正当你在敲入密码的时候,你的一位家人也正在镇上的另一处TAM机上输入密码.你打算从某个还有500元余额的账户上转出400元,而你的家人想从同一账户取走300元.倘 ...

  4. SQL SERVER 2008 数据库隔离级别代码演示

    SQL SERVER 2008 数据库隔离级别代码演示   个隔离级别(其实这是SQL 工业标) 种隔离级别,本身没有优劣之分,完全取决于应用的场景. 本质上,他们是在 隔离性(紊乱程度) 和 灵活性 ...

  5. SQL Server 事务隔离级别详解

    标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一 ...

  6. SQL Server 事务隔离级别

    一.事务隔离级别控制着事务的如下表现: 读取数据时是否占用锁以及所请求的锁类型. 占用读取锁的时间. 引用其他事务修改的行的读操作是否: 在该行上的排他锁被释放之前阻塞其他事务. 检索在启动语句或事务 ...

  7. 【转】SQL Server 事务隔离级别详解

    SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一定的影响作用. 步骤 事务隔离级别通过影响读操作来间接地影响写操作:可以在回话级别上设置事务隔离级别也可 ...

  8. SQL Server 之 事务与隔离级别实例讲解

    SQL Server 之 事务与隔离级别实例讲解 SQL Server 实现了6个隔离级别来防止并发情况下,类似企图并发的访问或修改同一数据时问题的发生.本文将带你体验全部6个隔离级别.正如你接下来将 ...

  9. SQL Server中的事务与其隔离级别之脏读, 未提交读,不可重复读和幻读

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

随机推荐

  1. eclipse debug source not fount

    1.选择Edit Source Lookup Path 2.选择Add 3.选择Java Project 4.选择相应的Project 进行OK确定即可 注意:做完以上的操作,要清除一下原来的断点,然 ...

  2. iOS8 UILocalNotification 和 UIRemoteNotification 使用注意 草稿,正在整理中。。。。

    先说一个关于UILocalNotification的知识点,容易被忘记: Each app on a device is limited to 64 scheduled local notificat ...

  3. iOS 中的Push Notifications简单实现(APNS)

    Android中的通知只有一种,就是Local Notifications,而iOS中除了Local Notifications外,还有一种Push Notifications.ios的这2种noti ...

  4. 101 个 MySQL 的调节和优化的提示(根据实际情况调整,有些已经不适用)

    英文原文:101 Tips to MySQL Tuning and Optimization ( July 12, 2011)翻译:http://www.oschina.net/translate/1 ...

  5. Java for LeetCode 076 Minimum Window Substring

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  6. RecyclerView拖拽排序和滑动删除实现

    效果图 如何实现 那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...

  7. 用java程序打印菱形

    代码如下

  8. setup 桌面化设置网卡

    # setup

  9. java基础知识回顾之java Thread类学习(十一)--join方法的理解

    以下面例子说明下面的源码:main 线程 和 A线程,A线程是main线程创建并且启动的,main线程优先级比较高,正在执行:这个时候main线程调用A.join()之后,main线程一直等待,直到A ...

  10. ***CI中的数据库操作(insert_id新增后返回记录ID)

    在system/application/config 文件夹和里面的config文件里已经配置了参数 $active_group = "default";$db['default' ...