1. C/S系统,ADO连接数据库,请问用什么方法可以使得某个用户在读/插入/修改/删除某个表中记录时锁定当前表,从而使得其它客户端上的用户只能读该表中记录,而不能插入/修改/删除该表的任何记录。2.另外,请问在一个事务中,执行的SQL语句条数,有没有限制?
  比方说,下面一些操作,我放在一个事务中实现,不知有什么问题没有?   '创建50个表,表名为:MyTab1,MyTab2...MyTab50,然后在各表中插入5000条记录。 
   
   DBConnection.BeginTrans
       for i=1 to 50
          TabName="MyTab" & i
          DBConnection.Execute("create table " & TabName & "(ID INTEGER)")
          for j=1 to 5000
             DBConnection.Execute("insert into " & TabName & "values(" & j ")")  
          next j
       next i
   DBConnection.CommitTrans
       
还请大家指教,谢谢了。

解决方案 »

  1.   

    表结构不能该了,,,我想用事务或加锁这样的解决,另外,我用的是Oracle库
      

  2.   

    第一:说明一下当你建立表的时候是自动提交的,放在事务中没有意义
    第二:循环向五十个表插入记录对于程序是没问题的,关键在于数据库的设置,数据的连接数是否允许建议PL/SQL完成此项工作!
      

  3.   

    computerdragon(dragon)
    ---------
    谢谢你让我明白了第一点,请问在oracle中哪儿设置库的数据连接数,不好意思,我新手。。
      

  4.   

    看来你的应用不是真正意义上的 C/S 架构,仅仅是采用服务型数据库。
    Oracle 数据库支持表锁定“锁定表  LOCK语句常常用于锁定整个表。当表被锁定后,大多数DML语言不能在该表上使用。LOCK语法如下:LOCK schema table IN lock_mode其中lock_mode有两个选项:
    share 共享锁,其他用户只能查询,不能更新,删除,插入;多个用户可以同时对同一个表设置共享锁share update mode 共享更新锁,锁定要被更新的行,其他用户可以同时查询,插入,更新未被锁定的行,即未被更新的行;exclusive 排它锁,仅允许其他用户查询,不允许插入,删除,更新;在同一时间仅允许一个用户在表上放置排他锁;如果加上nowait的话,如果发现该表已经被锁定,就不再等待,立即返回一个错误信息;例:LOCK TABLE intentory IN EXCLUSIVE MODECommit 或 Rollback 后解锁。
      

  5.   

    computerdragon(dragon)
    =============
    还有,我在程序中用DBConnection.Execute("Lock Table Mytab In SHARE MODE NOWAIT") 对表加共享琐,以及用DBCOnnection.Execute("select * from Mytab where ID=1 LOCK FOR UPDATE NOWAIT")对某行加共享锁,以避免其它客户端的用户对数据进行修改。
    但为什么其它客户端上的程序,在我锁住的这些表和行的时候,连查询(都是用的普通的Select语句)都没反应?
    另外,修改和删除也没反应,当属正常,不过,我希望当表和行被锁住时候,在执行修改和删除操作时,能不能返回异常什么的,提示当前表或行被加锁了,不能修改了,不然其它客户端总是在那边等待修改和删除的执行而没有提示信息,就不好了。
      

  6.   

    of123()
    =============
    在我回复computerdragon(dragon)的时候没看到你回复,您的回复我很关心,这正是我想了解的,但我在对表和行加了锁的时候,出现了上面的情况(在我对computerdragon(dragon)的回复中描述了),
    请问,是不是某个表或行用Lock命令加了锁后,程序其它的所有SQL语句是不是都得加上请求锁的信息?不然,是什么其它原因?
      

  7.   

    这种方法好像没什么好主意。
    通常做法三种:
    1、建立一个表来锁定这条记录的Key,如果发现有人正在操作这条记录,编辑完后查找锁定情况如果是有人操作,就返回提示信息。这种方法实现比较难。
    2、表添加一个字段Version(版本号),这个版本号自动增长,保存时如版本号不一致,则返回信息。
    3、表添加一个日期时间型字段,保存前检查时间是否一致,如果不一致,则返回提示信息。说说前面各位讲讲和情况:用事务来控制(基本是连接事务,SQL语句中的事务很难控制):
    这种方法是可以锁定表,但不能锁定记录(SQLSERVER是这样,ORACLE没用过),这样锁定是有问题的:
    一旦锁定表,则查找,编辑、删除等操作都不能搞定这个事,只能等待。如果大批量计算,问题会更多,而一般连接只能保持30秒,如果超过会出错。所以我说这种方法基本是现在浒的方法:
    连接事务结构如下:
    DBConnection.begintrans
    on error goto Trans_Exception
       DBConnection.execute("")'这种方法不是很好,原因再说。
      DBConnection.CommitTrans
       Exit sub'(Or function)
    Trans_Exception:
       DBConnection.RollbackTrans