当然可以,通过sql server 可以做到的啊。

解决方案 »

  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.   

    谢谢先。但是好像很复杂的样子。
    在默认情况下,sql server会自动锁定正在updata的记录吗?
      

  3.   

    pengdali(大力 V2.0):good idea
      

  4.   

    在查询纪录时,只有Oracle才能保持数据一致性,sqlserver做不到,必须加锁。