我要达到以下目的,麻烦各位达人帮忙设计一个方案:1.对一张表有一个先查询后更新(update)部分记录的事务,该事务可能被并行调用,但是要求该事务是互斥的,即一旦外部有一个进程调用该事务,则紧接着另一进程调用该事务时,必须等待前面进程调用的该事务执行完毕后才能继续。
2.有另外的进程会在上述事务运行时查询或插入数据,该操作不必与上述事务操作互斥
3.第1个问题中提及的事务操作需要返回一个记录集,也就是说期望它返回一组记录。因为该数据库会被不同的程序在不同的机器上调用,所以,上述工作期望在数据库中而不是应用程序中实现。在尝试过程中,碰到了以下问题
1.使用函数时,提示事务和Update错误
2.使用存储过程,不知道如何令它返回一个记录集
3.不知道如何实现上面第1个问题中提到的互斥。

解决方案 »

  1.   

    锁表,锁记录。
    1 如何锁一个表的某一行A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行2 锁定数据库的一个表SELECT * FROM table WITH (HOLDLOCK) 
    注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 
    其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX) 
    其他事务不能读取表,更新和删除
      

  2.   

    如dawugui所贴,合理利用rowlock,holdlock,必要时升级,另外存储过程返回记录集其实不难的,比如select就可以直接返回记录
      

  3.   

    里面的逻辑确实挺复杂。
    1.对一张表有一个先查询后更新(update)部分记录的事务,该事务可能被并行调用,但是要求该事务是互斥的,即一旦外部有一个进程调用该事务,则紧接着另一进程调用该事务时,必须等待前面进程调用的该事务执行完毕后才能继续。=======
    第一点,要实现资源独享,当你update时做需要锁表处理。2.有另外的进程会在上述事务运行时查询或插入数据,该操作不必与上述事务操作互斥
    =====
    查询肯定肯定没问题,锁定过程中insert能不能操作呢?....3.第1个问题中提及的事务操作需要返回一个记录集,也就是说期望它返回一组记录。
    ======
    返回结果集应该没问题的,可以用临时表来处理。
      

  4.   

    还是比较复杂的。
    1、执行某个update或者insert要独享的时候,要锁表。