首页 理论教育数据库技术与应用教程:事务隔离级

数据库技术与应用教程:事务隔离级

【摘要】:每个事务都是一个所谓的隔离级,它定义了用户彼此之间的隔离和交互的程度。因此事物的隔离性可以强制对事务进行某种程度的隔离,保证其他操作和应用在事务中看到的数据是一致的。在SQL Server中,使用SET TRANSACTⅠONⅠSOLATⅠON LEVEL语句定事务的隔离级别。这时使用SET语句设置事务的隔离级别为READ UNCOMMH-ⅠED,执行如下语句:SET TRANSACTⅠONⅠSOLATⅠON LEVEL READ UNCOMMⅠTTED重复刚才的查询操作,就可以看到查询结果,因为此时系统被设置了READ UNCOMMTTED,允许进行脏读。

每个事务都是一个所谓的隔离级,它定义了用户彼此之间的隔离和交互的程度。事务关系型数据库管理系统的一个重要的属性:它可以隔离在服务器上正在处理的不同的会话。在单用户的环境中,这个属性无关紧要。但在多用户环境下,能够隔离事务就显得非常重要。这样它们之间既不互相影响,还能保证数据库性能不受影响。

如果没有事务的隔离性,不同的SELECT语句将会在同一事务的环境中查询到不同的结果,因为在查询期间,数据有可能已被其他事务修改,这将导致不一致性。使用户不确定本次查询结果是否正确,结果能否作为其他操作的基础。因此事物的隔离性可以强制对事务进行某种程度的隔离,保证其他操作和应用在事务中看到的数据是一致的。较低级别的隔离性可以增加并发,但代价是降低数据的正确性。反之,较高的隔离性可以确保数据库的正确性,但可能会降低并发,从而影响到系统的执行效率

SQL Server 2012提供了五种隔离级:未提交读(READ UNCOMMⅠTTED)、提交读(READ COMMHⅠED)、可重复读(REPEATABLE READ)、快照(SNAPSHOT)和序列化(SERⅠALⅠZABLE)。

在SQL Server中,使用SET TRANSACTⅠONⅠSOLATⅠON LEVEL语句定事务的隔离级别。

由于在前一段T-SQL语句中创建了一个事务,但没有COMMⅠT语句,即该事务没有结束语或被撤销,所以后一段T-SQL语句执行后,系统提示正在执行查询,而不显示查询结果,如图7-3所示。

(www.chuimin.cn)

图7—3 系统提示正在执行查询

这时候的COLLEGE数据库的默认隔离级别是未提交读,如果一个事务更新了数据,但事务尚未结束,这时就会发生脏读的情况。在第一个查询窗口中使用ROLLBACK语句回滚以上操作,或直接关闭查询窗口终止事务。这时使用SET语句设置事务的隔离级别为READ UNCOMMH-ⅠED,执行如下语句:

SET TRANSACTⅠONⅠSOLATⅠON LEVEL READ UNCOMMⅠTTED

重复刚才的查询操作,就可以看到查询结果,因为此时系统被设置了READ UNCOMMTTED,允许进行脏读。