SQL Server 之 事务与隔离级别实例讲解
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SQL Server 之 事务与隔离级别实例讲解,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4225字,纯文字阅读大概需要7分钟。
内容图文
USEROPTIONS设置隔离
设置会话隔离 SET TRANSACTION ISOLATION LEVEL <ISOLATION NAME> --注意:在设置回话隔离时(REPEATABLE READ)两个单词需要用空格间隔开,但是在表隔离中可以粘在一起(REPEATABLEREAD) 设置查询表隔离 SELECT ....FROM <TABLE> WITH (<ISOLATION NAME>)
正如你在下面的例子中即将看到的,隔离级别越高,提供的保护级别也越高(防止更多的并发性问题)。并且,每个隔离级别包括了前一个级别所提供的保护,因此,每个后续的更高隔离级别以避免更多并发性问题的形式提供了额外的保护。但是,世上没有免费的午餐,隔离级别越高,数据可用性就越低。选择合适的隔离级别是一种在高度安全的并发性和数据的高可用性之间寻求平衡的行为。
三、引入实例
为了创建并发环境,所有例子使用2个SQL Server Session,每个会话运行一个不同的事务,每个事务访问相同的资源。在SQL Server Management Studio中,每个查询窗口代表了一个不同的Session,因此,你可以在SQL Server Management Studio中为不同的事务使用不同的查询窗口。
所有例子包含了真实场景以便你将这一切建立在现实的基础上。
1、READ UNCOMMITTED 未提交读
READ UNCOMMITTED 事务隔离级别根本就没有提供事务间的隔离,它允许违反并发性原则的最基本形式之一 -- 脏读。当一个事务能够读取另一个事务中已经Update但尚未Commit的数据时,“脏读”就发生了。READ UNCOMMITTED 读操作不申请锁,运行读取未提交的修改,也就是允许读脏数据,读操作不会影响写操作请求排他锁。
READ UNCOMMITTED 常应用于:单用户系统;系统中两个事务同时访问同一资源的可能性为零或几乎为零;
- 当使用Rowversion数据类型控制并发性时
- 单用户系统
- 系统中两个事务同时访问同一资源的可能性为零或几乎为零
- 当使用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 | 上述所有并发性问题 | 无 |
参考
SQL Server 之 事务与隔离级别实例讲解
标签:
本文系统来源:http://www.cnblogs.com/xinaixia/p/5703175.html
内容总结
以上是互联网集市为您收集整理的SQL Server 之 事务与隔离级别实例讲解全部内容,希望文章能够帮你解决SQL Server 之 事务与隔离级别实例讲解所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。