如何在插入记录以前锁住表,不允许别的insert,update,del动作

--设tb(A,B,C)  
  create   table   #tb(A   varchar(2),B   varchar(2),C   varchar(2))  
  insert   into   #tb  
  select   'a1','b1','c1'  
  union   all   select   'a2','b2','c2'  
  union   all   select   'a3','b3','c3'  
   
  --1)排它锁  
  --在第一个连接中执行以下语句  
  begin   tran  
        update   #tb  
        set   A='aa'  
        where   B='b2'  
        waitfor   delay   '00:00:3'     --等待3秒  
  commit   tran  
   
  --在第二个连接中执行以下语句  
  begin   tran  
        select   *   from   #tb  
        where   B='b2'        
  commit   tran  
  --若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒  
   
  --2)共享锁  
  --在第一个连接中执行以下语句  
  begin   tran  
        select   *   from   #tb   holdlock   --holdlock人为加锁  
        where   B='b2'    
        waitfor   delay   '00:00:3'     --等待3秒  
  commit   tran  
   
  --在第二个连接中执行以下语句  
  begin   tran  
        select   A,C   from   #tb  
        where   B='b2'    
        update   #tb  
        set   A='aa'  
        where   B='b2'        
  commit   tran  
  --若同时执行上述两个语句,则第二个连接中的select查询可以执行  
  --而update必须等待第一个连接中的共享锁结束后才能执行   即要等待30秒  
   
  --3)死锁  
  --增设tb2(D,E)  
  create   table   #tb2(D   varchar(2),E   varchar(2))  
  insert   into   #tb2  
  select   'd1','e1'  
  union   all   select   'd2','e2'  
   
  --在第一个连接中执行以下语句  
  begin   tran  
        update   #tb  
        set   A='aa'  
        where   B='b2'    
        waitfor     delay   '00:00:5'  
        update   #tb2  
        set   D='d5'  
        where   E='e1'    
  commit   tran  
         
  --在第二个连接中执行以下语句  
  begin   tran  
        update   #tb2  
        set   D='d5'  
        where   E='e1'    
        waitfor     delay   '00:00:3'  
        update   #tb  
        set   A='aa'  
        where   B='b2'      
  commit   tran  
   
  --删除临时表  
  drop   table   #tb,#tb2  

 

 

 

 

--锁定记录,只允许单用户修改的例子:  
   
  --创建测试环境  
  --创建测试表--部门表  
  create   table   部门(departmentid   int,name   varchar(10))  
   
  --记录锁定表  
  create   table   lock(departmentid   int,dt   datetime)  
   
  go  
  --因为函数中不可以用getdate,所以用个视图,得到当前时间  
  create   view   v_getdate   as   select   dt=getdate()  
  go  
  --创建自定义函数,判断记录是否锁定  
  create   function   f_chk(@departmentid   int)  
  returns   bit  
  as  
  begin  
  declare   @re   bit,@dt   datetime  
  select   @dt=dt   from   v_getdate  
  if   exists(select   1   from   lock   where   departmentid=@departmentid  
  and   datediff(ss,dt,@dt)<5)  
  set   @re=1  
  else  
  set   @re=0  
  return(@re)  
  end  
  go  
   
  --数据处理测试  
  if   dbo.f_chk(3)=1  
  print   '记录被锁定'  
  else  
  begin  
  begin   tran  
  insert   into   lock   values(3,getdate())  
  update   部门   set   name='A'   where   departmentid=3  
  delete   from   lock   where   departmentid=3  
  commit   tran  
  end  
   
  --删除测试环境  
  drop   table   部门  
  drop   view   v_getdate  
  drop   function   f_chk

posted @ 2009-12-11 14:21    阅读(837)  评论(0编辑  收藏  举报