SET TRANSACTION ISOLATION LEVEL
控制由连接发出的所有 Microsoft® SQL Server™ SELECT 语句的默认事务锁定行为。语法
SET TRANSACTION ISOLATION LEVEL
    { READ COMMITTED
        | READ UNCOMMITTED
        | REPEATABLE READ
        | SERIALIZABLE 
    }参数
READ COMMITTED指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。READ UNCOMMITTED执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。REPEATABLE READ锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。SERIALIZABLE在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。注释
一次只能设置这些选项中的一个,而且设置的选项将一直对那个连接保持有效,直到显式更改该选项为止。这是默认行为,除非在语句的 FROM 子句中在表级上指定优化选项。SET TRANSACTION ISOLATION LEVEL 的设置是在执行或运行时设置,而不是在分析时设置。示例
下例为会话设置 TRANSACTION ISOLATION LEVEL。对于每个后续 Transact-SQL 语句,SQL Server 将所有共享锁一直控制到事务结束为止。SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
SELECT * FROM publishers
SELECT * FROM authors
...
COMMIT TRANSACTION

解决方案 »

  1.   

    设table1(A,B,C)
    A    B    C
    a1   b1   c1
    a2   b2   c2
    a3   b3   c31)排它锁
    新建两个连接
    在第一个连接中执行以下语句
    begin tran
       update table1
       set A='aa'
       where B='b2'
       waitfor delay '00:00:30'  --等待30秒
    commit tran
    在第二个连接中执行以下语句
    begin tran
       select * from table1
       where B='b2'   
    commit tran若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒2)共享锁
    在第一个连接中执行以下语句
    begin tran
       select * from table1 holdlock -holdlock人为加锁
       where B='b2' 
       waitfor delay '00:00:30'  --等待30秒
    commit tran在第二个连接中执行以下语句
    begin tran
       select A,C from table1
       where B='b2' 
       update table1
       set A='aa'
       where B='b2'   
    commit tran若同时执行上述两个语句,则第二个连接中的select查询可以执行
    而update必须等待第一个连接中的共享锁结束后才能执行 即要等待30秒3)死锁
    增设table2(D,E)
    D    E
    d1   e1
    d2   e2
    在第一个连接中执行以下语句
    begin tran
       update table1
       set A='aa'
       where B='b2' 
       waitfor  delay '00:00:30'
       update table2
       set D='d5'
       where E='e1' 
    commit tran
       
    在第二个连接中执行以下语句
    begin tran
       update table2
       set D='d5'
       where E='e1' 
       waitfor  delay '00:00:10'
       update table1
       set A='aa'
       where B='b2'  
    commit tran同时执行,系统会检测出死锁,并中止进程
      

  2.   


     访问和更改关系数据  
    自定义事务隔离级别
    默认情况下,Microsoft® SQL Server™ 2000 在 READ COMMITTED 的一个隔离级别上操作。但是,应用程序可能必须运行于不同的隔离级别。若要在应用程序中使用更严格或较宽松的隔离级别,可以通过使用 SET TRANSACTION ISOLATION LEVEL 语句设置会话的隔离级别,来自定义整个会话的锁定。指定隔离级别后,SQL Server 会话中所有 SELECT 语句的锁定行为都运行于该隔离级别上,并一直保持有效直到会话终止或者将隔离级别设置为另一个级别。例如,若要设置事务隔离级别为可串行读,以确保并发事务不能在 authors 表中插入幻像行,请执行:USE pubs
    GO
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    GO
    BEGIN TRANSACTION
    SELECT au_lname FROM authors说明  如果必要,可以通过指定表级锁定提示来替代单个 SELECT 语句的隔离级别。指定表级锁定提示不会影响会话中的其它语句。建议仅在绝对必要时才使用表级锁定提示更改默认的锁定行为。
    若要确定当前设置的事务隔离级别,请使用 DBCC USEROPTIONS 语句,例如:USE pubs
    GO
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    GO
    DBCC USEROPTIONS
    GOSet Option Value 
    Textsize 4096 
    Language us_english 
    Dateformat mdy 
    Datefirst 7 
    isolation level repeatable read 
    (5 rows affected)
    DBCC execution completed. If DBCC printed error messages, see your System Administrator.
    请参见DBCC USEROPTIONSSET TRANSACTION ISOLATION LEVELSELECT©1988-2000 Microsoft Corporation。保留所有权利。
      

  3.   

    http://expert.csdn.net/Expert/topic/1785/1785314.xml?temp=.3830988