这两种隔离级别都是通过行版本控制在tempdb中生成数据的复本来解决数据的写和读的时候发生锁及阻塞的问题的。不过snapshot isolation需要在数据库中执行
ALTER DATABASE Aesop
SET ALLOW_SNAPSHOT_ISOLATION ON
之后,然后在执行事务之前,设置连接的隔离级别
SET TRANSACTION ISOLATION LEVEL Snapshot;
BEGIN TRAN
SELECT Title
FROM FABLE
WHERE FableID = 2
这时候当发生第二个事务对fableid=2的行进行更新的时候,它可以进行更新,但是在更新事务提交之后,查询事务依然是无法查到更新事务所做的修改,它还是只能查询到原始的数据,这种情况类似于repeatable read隔离级别,但是在repeatable read下,更新事务是无法更新的,直到查询事务提交之后才可以。
Read Committed Snapshot Isolation只是针对sqlserver默认的read committed隔离级别的。使用它需要执行如下sql:
ALTER DATABASE Aesop
SET READ_COMMITTED_SNAPSHOT ON
如果数据库只是普通的read committed级别下,当执行一个更新事务但没有提交时,再执行一个对更新数据进行查询的事务,查询事务将无法查询,被阻塞,但是在 READ_COMMITTED_SNAPSHOT被打开的情况下,在上面那种情况中,查询事务将不会被阻塞,它能够查询到未更新前的数据。
说句最俗的,Snapshot Isolation是针对SET TRANSACTION ISOLATION LEVEL Snapshot;的,在使用的时候需要在事务前设置隔离级别,而Read Committed Snapshot Isolation完全不需要使用set transaction isolation,因为它是针对数据默认的read committed隔离级别的。
Read Committed Snapshot Isolation和Snapshot Isolation
最新推荐文章于 2024-07-19 11:09:26 发布