SQL2000:有一个存储过程,在同一时间内只允许执行一次。也就是说在一个人执行的时候别人是不允许执行的。BEGIN TRANSACTION
insert into  T_A with(tablock) (SynDatetime,SynOperator) Values(getdate(),@OPNAME)
if @@ERROR=0 and @@ROWCOUNT>0 
begin
set @RID=SCOPE_IDENTITY()
        --------------
        若干条 insert \ update \ delete \ select
        --------------  
update T_A set SynStatus=1,SynEnd=getdate() where SynID=@RID
end
COMMIT TRANSACTION问题1:这种给表加锁的写法对吗?
我这样写是否可以保证 在事务执行期间 T_A 表是锁定的?
是否必须要像这样: select * from T_A WITH (tablock) 给表加锁?问题2: tablock 换成 UPDLOCK 是否也行?就我的需要来说那个更好一些?问题3:除了用锁以外还有没有更好的办法?谢谢

解决方案 »

  1.   

    在执行事务前,加上事务的隔离级别:
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED  --未提交读
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED    --已提交读
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ   --获取一致的可重复读操作 
    SET TRANSACTION ISOLATION LEVEL SNAPSHOT          --已提交读快照级
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE      --系列化级别
    五个级别只要加一个就可以了。
    建议加这个级别:SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
    BEGIN TRANSACTION
    ..........COMMIT TRANSACTION
      

  2.   

    有关锁的使用,或用什么锁,参考:http://blog.csdn.net/hdhai9451/article/details/9297763
      

  3.   

    SET TRANSACTION ISOLATION LEVEL 
    sql server 2000 有这个东东吗?
      

  4.   


    问题1:这种给表加锁的写法对吗?
    我这样写是否可以保证 在事务执行期间 T_A 表是锁定的?
    是否必须要像这样: select * from T_A WITH (tablock) 给表加锁?这个写法没问题,你试一下就知道,开一个查询窗口
    begin tran
    insert into dbo.T_A with(tablock)  values (7,'G')注意别提交也别回滚再开一个查询窗口,随便查不管有没有where 条件,查询都别阻塞问题2: tablock 换成 UPDLOCK 是否也行?就我的需要来说那个更好一些?这个我只能说不一定,你不是要锁定整张表吗?
    当表上存在索引的时候,
    begin tran
    insert into dbo.T_A with(tablock)  values (7,'G')
    注意别提交也别回滚另外开一个查询窗口,查询其他(非上面插入的)数据,还是可以查询到的
    (注意是表上有索引的情况)
    问题3:除了用锁以外还有没有更好的办法?
    那就是数据库设置更高的隔离级别了,列化读
    不过这个不太现实,因为你只是要求这个地方在执行期间把表锁定
    可序列化隔离级别时对全库的操作都执行此规则,所以不推荐
      

  5.   

    这个的关键是,在你的存储过程中,哪些操作是在同一时间,只能有一个用户来执行的,是第一行的insert 操作,还是后面的update操作呢
      

  6.   

    写这个存储过程的目的是用来数据同步。
    分公司要从总公司下载数据, 然后同步本地库(新建、修改、删除)
    分公司要向总公司上传销售数据
    总公司与分公司的数据库通过VPN连接
    目前的想法:所有的数据上传、下载都是通过应用程序调用存储过程来实现。情况就是这么个情况 各位见多识广 小弟很是钦佩不知到 有木有这样一种 省事省力 少写程序(最好不用写程序) 服务器之间自己就能安全可靠的同步数据 的功能?啊啊 
      

  7.   

    那就用数据库复制吧,不过你这个是双向复制,一方面,你需要把总公司的一部分数据,同步到分公司,另一方面,你需要把分公司的销售数据,同步到总公司。通过sql server 的数据库复制技术,就可以实现。
      

  8.   

    你用的是sql server 2000是不:看看这个吧:http://wenku.baidu.com/view/731c5da0f524ccbff121840f.html