SQL Server 2008 R2 事务与隔离级别实例讲解

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

SQL Server 实现了6个隔离级别来防止并发情况下,类似上面例子中企图并发的访问或修改同一数据时问题的发生。本文将带你体验全部6个隔离级别。正如你接下来将看到的,你将理解每个隔离级别所能达成的效果以及何时使用它。

本文假定你对事务和隔离级别的基本概念有所了解。本文所使用的例子基于AdventureWorks数据库而运行。

一、事务简介

SQL Server的6个隔离级别中有5个是用于隔离事务的,它们因而被称作事务隔离级别。另外的一个工作于语句级别。我们先从什么是事务开始吧!

让我们再次回到ATM机的例子。你打算在2个账户间转账。注意,转账至少涉及2个数据更改的操作:一个账户需要减少余额,而另一个账户需要增加余额。好,假定借方账户(debit account)转出资金操作成功了,而贷方账户(credit account)转入资金操作失败了。你不想要这一幕发生,因为那样的话你的钱就没了。你希望两个账户的数据更新作为一个完整的工作单元来处理--要么完全成功,要么完全失败。我们称这样的工作单元为“事务”。事务就是数据库级别的工作单元,包括一个或多个数据更改,必须整体地被视为一个单一的单元,它们要么全都成功,要么什么也不曾发生。

这里再列举几个要求多个数据修改操作必须要么完全成功要么什么也没发生的例子。当数据被合并到数据库时,可能有多个表需要更新。当顾客下订单时,Order表、Invoice Line Item表和Product表的数据可能都需要更新。购买机票也许要求更新Passenger表和Reservations表。无论何时当一个操作要求多个数据更改操作整体地作为单一的单元来处理,这就是需要使用事务的时候。

现在是时候引入2个有用的概念了--提交和回滚。如果事务中所有的数据更改操作都成功了,那么这些数据更改就可以被提交(也就是持久化到数据库)。否则,截止到失败点事务中所发生的所有数据更改必须被回滚(也就是撤销操作,什么也不曾发生)。

现在让我们来看一看使用事务的一些实际命令。在本文的例子中,我们将使用 Explicit Transaction Mode。在这种模式下,我们使用BEGIN TRANSACTION 命令开启一个事务,视具体情况,使用COMMIT TRANSACTION 或者 ROLLBACK TRANSACTION 命令终止一个事务。

二、 隔离级别简介

必须小心对待并发情况,因为它们可能引发已知的并发性问题,包括“脏读”、“不可重复读”和“幻像读”,这些问题可能反过来导致数据的不良后果,就像我们在ATM机例子中感受的一样。正如我们已经知道的,为了防止并发性问题,隔离级别用于将事务或语句相互间隔离开来。 下面是SQL Server 2008中定义的隔离级别名称:

A. Transaction Isolation Level

1. READ UNCOMMITTED  
2. READ COMMITTED (Default)  
3. REPEATABLE READ  
4. SERIALIZABLE  
5. SNAPSHOT

B. Statement Isolation Level

6. READ COMMITTED SNAPSHOT

正如你在下面的例子中即将看到的,隔离级别越高,提供的保护级别也越高(防止更多的并发性问题)。并且,每个隔离级别包括了前一个级别所提供的保护,因此,每个后续的更高隔离级别以避免更多并发性问题的形式提供了额外的保护。但是,世上没有免费的午餐,隔离级别越高,数据可用性就越低。选择合适的隔离级别是一种在高度安全的并发性和数据的高可用性之间寻求平衡的行为。

让我们来看看具体实例。

三、引入实例

所有例子都运行于AdventureWorks数据库,你可以下载AdventureWorks数据库(AdventureWorks2008_SR4.exe, 包含了除2008R2以外的所有版本AdventureWorks数据库)。    
下载本文所有实例的脚本文件

为了创建并发环境,所有例子使用2个SQL Server Session,每个会话运行一个不同的事务,每个事务访问相同的资源。在SQL Server Management Studio中,每个查询窗口代表了一个不同的Session,因此,你可以在SQL Server Management Studio中为不同的事务使用不同的查询窗口。

所有例子包含了真实场景以便你将这一切建立在现实的基础上。

例1. READ UNCOMMITTED 事务隔离级别

READ UNCOMMITTED 事务隔离级别根本就没有提供事务间的隔离,它允许违反并发性原则的最基本形式之一 -- 脏读。当一个事务能够读取另一个事务中已经Update但尚未Commit的数据时,“脏读”就发生了。

READ UNCOMMITTED 事务隔离级别应用于:

  • 单用户系统

  • 系统中两个事务同时访问同一资源的可能性为零或几乎为零

  • 当使用Rowversion数据类型控制并发性时

例2. READ COMMITTED 事务隔离级别

通过仅允许一个事务读取另一个事务中已经提交的数据,READ COMMITTED 事务隔离级别防止了“脏读”问题。这是SQL Server中默认的事务隔离级别。

例3. REPEATABLE READ 事务隔离级别

正如你在前一个事务隔离级别的步骤2所看到的,Session 2中的事务能够修改已经被Session 1中的事务读取的数据。正像真实场景中所描述的,这可能导致“LOST UPDATE”。REPEATABLE READ 事务隔离级别不允许这种情况发生,因为它违背了REPEATABLE READ原则。换句话说,Session 1中的事务读取同一数据可能会产生不同的结果。

例4. SERIALIZABLE 事务隔离级别

为了向你展示SERIALIZABLE 事务隔离级别防止的并发性问题,本例我们从REPEATABLE READ 事务隔离级别开始。

例5. SNAPSHOT事务隔离级别

也许你已经注意到,在上述例1到例4中,防止并发性问题的同时也降低了数据的可访问性。先是不允许Read,然后是不允许Update,不允许Insert。SNAPSHOT事务隔离级别防止了之前那些隔离级别所能防止的许多并发性问题,同时降低了与之相关的成本。它允许更高的数据可用性。

通过在事务开始前在TempDB中使用row versions创建一份数据库的虚拟快照,SNAPSHOT事务隔离级别完成了此壮举。此后它只允许事务访问该数据库虚拟快照。这种方法被称做“基于版本控制的隔离”(versioning-based isolation,背后细节的完整介绍请参考Understanding Row Versioning-Based Isolation Levels。

使用versioning-based isolation,事务仅能看到虚拟快照中的数据。因此,其他事务仍然能够访问同一数据,只要它们不去修改已经被第一个事务修改过的数据就好。如果那样做了(企图修改数据),那么,那些事务将会被回滚并以错误消息终止。

只有当数据库中启用SNAPSHOT事务隔离级别的开关打开后,才能使用它。打开此开关将告知数据库去设置版本化环境。理解这一点很重要,因为,一旦版本化开启,数据库会有维护版本化的开销,无论是否有事务正在使用SNAPSHOT事务隔离级别。

例6. READ COMMITTED SNAPSHOT 隔离级别

到目前为止,所有的隔离级别都是将事务相互间隔离开来。一旦初始事务完成了,对其他事务变得不可用的资源才又变得可用。READ COMMITTED SNAPSHOT 隔离级别在这点上有所不同,它能够读取其已经被他事务提交的数据。

READ COMMITTED SNAPSHOT 隔离级别也是通过数据库开关来打开的。然后,任何使用READ COMMITTED SNAPSHOT 隔离级别的事务将通过版本化起作用。

希望通过以上具体实例,能够帮助你理解如何正确地隔离事务和语句从而防止并发性问题。

四、小结

隔离级别

解决的并发性问题

存在的并发性问题

READ UNCOMMITTED

不适用于并发场合

Dirty Reads, Non-repeatable Reads, Phantom Reads

READ COMMITTED

Dirty Reads

Lost Update , Non-repeatable Reads, Phantom Reads

REPEATABLE READ

Non-repeatable Reads

Phantom Reads, potentially Deadlocking

SERIALIZABLE

Phantom Reads

Less Data Availability, potentially Deadlocking

SNAPSHOT

上述所有并发性问题

事务访问的是虚拟快照,其他事务Committed的数据对当前事务仍然不可见,也不允许Update被其他事务Updated的数据。

READ COMMITTED SNAPSHOT

上述所有并发性问题

参考:    
http://blogs.interfacett.com/understanding-isolation-levels-sql-server-2008-r2-2012-examples

本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1600612 ,如需转载请自行联系原作者

SQL Server 2008 R2 事务与隔离级别实例讲解相关推荐

  1. mysql 事务sqlserver_SQLServer数据库:事务与隔离级别实例讲解

    本文主要向大家介绍了SQLServer数据库:事务与隔离级别实例讲解,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. 上班途中,你在一处ATM机前停了下来.正当你在敲入密码 ...

  2. SQL Server 2008 R2数据库镜像部署

    概述 "数据库镜像"是一种针对数据库高可用性的基于软件的解决方案.其维护着一个数据库的两个相同的副本,这两个副本分别放置在不同的SQL Server数据库实例中.建议使用不同位置的 ...

  3. SQL Server 2008 R2 性能计数器详细列表(三)

    原文:SQL Server 2008 R2 性能计数器详细列表(三) SQL Server,Deprecated Features 对象: 监视指定为不推荐使用的功能: SQL Server Depr ...

  4. SQL Server 2008 R2中文版快速安装

    SQL Server 2008 R2中文版快速安装 1 实验环境 1)域: 域名为fengxja.com: 域功能级别和林功能级别为Windows server 2003模式. 2)DC01服务器: ...

  5. SQL Server 2005 中提供的隔离级别

    SQL Server 2005 中提供的隔离级别 隔离级别 脏读(可能的情况) 非可重复读取(可能的情况) Phantom(可能的情况) 并发控制 读取未提交 是 是 是 (无) 读取已提交 否 是 ...

  6. SQL Server 2008 R2的发布订阅配置实践

    纸上得来终觉浅,绝知此事要躬行.搞技术尤其如此,看别人配置SQL SERVER的复制,发布-订阅.镜像.日志传送者方面的文章,感觉挺简单,好像轻轻松松的,但是当你自己去实践的时候,你会发现还真不是那么 ...

  7. sqlserver200864位下载_sqlserver2008 64位|sql server 2008 R2 64位企业版下载 - 121下载站

    sql server 2008 R2 64位企业版是微软官方发布的64位版本,支持win7.win8等操作系统.sql server 2008 R2是最新版本的数据库软件,可以有效地提升企业内部数据库 ...

  8. PowerShell 2.0 实践(十二)管理 SQL Server 2008 R2(1)

    DBA可以使用的工具很多,对于SQL Server来说,有查询分析器.事件探查器.命令行工具等,其中SQL语句是重中之重,但是PowerShell的出现使得DBA又多了一种选择. 测试脚本下载 本系列 ...

  9. SQL Server 2008 R2如何开启数据库的远程连接

    SQL Server 2008 R2如何开启数据库的远程连接 转载于:https://www.cnblogs.com/macT/p/10213025.html

  10. 2008 r2 sn sqlserver_sqlserver 下载地址(SQL Server 2008 R2 中英文 开发版/企业版/标准版 下载)...

    注:企业版无法安装在xp和win7,开发版才可以! 一. 简体中文 1. SQL Server 2008 R2 Developer (x86, x64, ia64) - DVD (Chinese-Si ...

最新文章

  1. 主瓣,旁瓣,栅瓣概念解析
  2. 电脑有回声_游戏东西丨兽人游戏Echo回声电脑手机汉化版
  3. Scrapy从理论到爬图
  4. 实例讲解getopt()函数的使用
  5. LeetCode 860. 柠檬水找零(贪心)
  6. ipv6地址为什么显示两个_【聚焦】IPv6进行时,别被这些因素绊住脚
  7. OpenCV3学习(12.3) kalman滤波器
  8. URL Routing
  9. prim算法求最小生成树_最小生成树的两种方法(Kruskal算法和Prim算法)
  10. hdu 1247 map
  11. [转]python3_unboundlocalerror报错原因
  12. 两种排序方法(直接判断)
  13. 【渝粤教育】国家开放大学2018年秋季 0053-21T移动通信技术与移动通信设备 参考试题
  14. OpenCV2+入门系列(一):OpenCV2.4.9的安装与测试
  15. 清理windows资源管理器右键打开方式,新建菜单
  16. 简单了解Java语言
  17. Java - 填充Word文本域、Word转PDF操作
  18. pxe启动虚拟机过程记录
  19. Centos8安装Redis
  20. studio3t连接mysql_使用 Studio 3T 连接到 Azure Cosmos DB 的 API for MongoDB | Microsoft Docs

热门文章

  1. 620. 有趣的电影
  2. gradientDescent----吴恩达机器学习作业
  3. html5绘制警告牌,2.10 创建自定义图形:绘制扑克牌花色 - HTML5 Canvas 实战
  4. 代码整洁之道读书笔记----第四章---注释--第一节-什么是好注释如何写好注释
  5. 使用boost中的线程池
  6. 【Kernel Method】Kernel Method核方法介绍
  7. 凸优化中:单纯形是一种多面体的证明
  8. vue 背景弹出禁止滚动_vue-蒙层弹窗里的内容滚动。外层大页面禁止滚动
  9. python数据框追加_将行追加到Pandas数据框将添加0列
  10. _itemmod_refresh