BEGIN TRANSACTIONSELECT ... FROM tablename WITH (XLOCK) where ...
update tablename ...
commit TRANSACTION

解决方案 »

  1.   

    在第一个连接中执行以下语句
    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秒
      

  2.   

    需要先设定锁的隔离级别。
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ说明如下:
    有一个表的数据如下
    c1          c2                                                     
    ----------- ------------------------ 
    1           2003-01-08 12:00:00.000
    2           2003-01-08 12:00:00.000
    3           2003-01-08 12:00:00.000在SQL Query Analyzer中开两个窗口(相当于两个连接)
    1 窗口A中顺序执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    begin tran
    select * from t3 where c1=1  --此时已经锁定了该行2 在窗口B中顺序执行select * from t3  -可以得到结果update t3 set c2='2003-1-8 12:00:00' where c1=1    --将会等待直到A释放行锁3 在窗口A中顺序执行commit tran     --释放行锁,B的更新将被提交根据楼主的意思,需求是:行锁,并且在查询时就锁住,而不是更新时,所以选择Reapeatable read是最合适的。顺便说一句,采用表级锁,也可以,但是并发程度太低,所以应只在必要时才使用该选项。BOL的说明:
    SET TRANSACTION ISOLATION LEVEL
        { READ COMMITTED
            | READ UNCOMMITTED
            | REPEATABLE READ
            | SERIALIZABLE 
        }REPEATABLE READ锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。SERIALIZABLE在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
      

  3.   

    good explanation . looks more complicated than Oracle
      

  4.   

    TO w_rose(w_rose):你的方法可行么,能不能把你的方法说详细点,最好给例子。