6.3.4 SQL Server的并发控制机制

6.3.4 SQL Server的并发控制机制

1)SQL Server中的锁

SQL Server采用封锁机制保证并发操作的可串行性。从数据库系统的角度来看,锁可以分为:共享锁、更新锁、排它锁和意向锁,其中意向锁又分意向共享锁,意向排它锁和意向排它共享锁。SQL Server锁模式及说明见表6-4。

表6-4 SQL Server锁模式及说明

续表

总的来说,在试图修改数据(增删改)时,事务会请求数据资源的一个排它锁而不考虑事务的隔离级别。排它锁直到事务结束才会解除。对于单语句事务,语句执行完毕该事物就结束了;对于多语句事务,执行完提交事务(COMMIT TRAN)或者回滚事务(ROLLBACK TRAN)命令才意味着事务的结束。

在事务持有排它锁期间,其他事务不能修改该事务正在操作的数据行,但能否读取这些行,则取决于事务的隔离级别。

在试图读取数据时,事务默认请求数据资源的共享锁,事务结束时会释放锁。可以通过事务隔离级别控制事务读取数据时锁定的处理方式。

2)SQL SERVER中事务的隔离级别

SQL Server中事务隔离级别分为以下两大类:

①基于悲观并发控制(会话级别)的4个隔离级别(隔离级别从前至后依此增强):

未提交读(READ UNCOMMITTED)、已提交读(默认)(READ COMMITTED)、可重复读(REPEATABLE READ)和序列化(SERIALIZABLE)。

不同会话之间的隔离级别及会话嵌套间的隔离级别互不影响。

②基于乐观并发控制(数据库级别)的2个隔离级别(隔离级别从前至后依此增强):

快照(SNAPSHOT)和可提交读快照(默认)(READ COMMITTED SNAPSHOT)。

可以通过下面的语句设置会话的隔离级别:

SET TRANSACTION ISOLATION LEVEL<isolation name>

隔离级别可以确定并发用户读取或写入的行为。在获得锁和锁的持续期间,虽不能控制写入者的行为方式,但可以控制读取者的行为方式。此外,也可通过控制读取者的行为方式来隐式影响写入者的行为。隔离级别越高读取者请求的锁越强,持续时间越长,数据一致性越高,并发性越低。

在事务持有一个数据资源的锁时,若另一个事务请求该资源的不兼容锁时,请求会被阻塞而进入等待状态。该请求一直等待直至被锁定的资源释放或者等待超时。

下面依次对6类隔离级别进行简单的介绍。

未提交读:在该隔离级别中,读取者无须请求共享锁,从而也不会与持有排它锁的写入者发生冲突。这样一来,读取者可以读到写入者尚未提交的更改,即读脏数据。

已提交读:在该隔离级别中,读取者必须获取一个共享锁以防止读取到未提交的数据。这意味着,若有其他事务正在修改资源则读取者必须进行等待,当写入者提交事务后,读取者就可以获得共享锁进行读取。

该隔离级别中,事务所持有的共享锁不会持续到事务结束,当查询语句结束(甚至未结束)时,便释放锁。这意味着在同一个事务中,两次相同数据资源的读取之间,不会持有该资源的锁,因此,其他事务可以在两次读取间隙修改资源从而导致两次读取结果不一致,即不可重复读,同时该隔离级别下也会产生更新丢失问题。

可重复读:在该隔离级别中,读取者必须获取共享锁且持续到事务结束。该隔离级别获得的共享锁只会锁定执行查询语句时符合查询条件的资源。该隔离级别下可以避免更新丢失问题,但会产生幻读,即同一事务两次相同条件的查询之间插入了新数据,导致第二次查询获取到了新的数据。

序列化:在该隔离级别中,读取者必须获取共享锁且持续到事务结束。该隔离级别的共享锁不仅锁定执行查询语句时符合查询条件的数据行,也会锁定将来可能用到的数据行。即阻止可能对当前读取结果产生影响的所有操作。

快照:在该隔离级别中,读取者在读取数据时,它是确保获得事务启动时最近提交的可用行版本。这意味着,保证获得的是提交后的读取并且可以重复读取,以及确保获得的不是幻读,就像是在序列化级别中一样。但该隔离级别并不会获取共享锁。该隔离级别的事务中,SQL Server会进行冲突检测以防止更新冲突,这里的检测不会引起死锁问题。

可提交读快照:该隔离级别与快照的不同之处在于,读取者获得是语句启动时(不是事务启动时)可用的最后提交的行版本。

快照和可提交读快照是SQL Server基于行版本控制技术的隔离级别,在这两个隔离级别中,读取者不会获取共享锁。SQL Server可以在tempdb库中存储已提交行的之前版本。如果当前版本不是读取者所希望的版本,那么SQL Server会提供一个较旧的版本。

快照在逻辑上与序列化类似;可提交读快照在逻辑上与可提交读类似。这两个隔离级别中执行删除和更新语句需要复制行的版本,插入语句则不需要。因此,对于更新和删除操作的性能会有负面影响,因无须获取共享锁,所以读取者的性能通常会有所改善。

6类隔离级别对并发控制的影响见表6-5。

表6-5 6类隔离级别对并发控制的影响