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
还请大家指教,谢谢了。
比方说,下面一些操作,我放在一个事务中实现,不知有什么问题没有? '创建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
还请大家指教,谢谢了。
第二:循环向五十个表插入记录对于程序是没问题的,关键在于数据库的设置,数据的连接数是否允许建议PL/SQL完成此项工作!
---------
谢谢你让我明白了第一点,请问在oracle中哪儿设置库的数据连接数,不好意思,我新手。。
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 后解锁。
=============
还有,我在程序中用DBConnection.Execute("Lock Table Mytab In SHARE MODE NOWAIT") 对表加共享琐,以及用DBCOnnection.Execute("select * from Mytab where ID=1 LOCK FOR UPDATE NOWAIT")对某行加共享锁,以避免其它客户端的用户对数据进行修改。
但为什么其它客户端上的程序,在我锁住的这些表和行的时候,连查询(都是用的普通的Select语句)都没反应?
另外,修改和删除也没反应,当属正常,不过,我希望当表和行被锁住时候,在执行修改和删除操作时,能不能返回异常什么的,提示当前表或行被加锁了,不能修改了,不然其它客户端总是在那边等待修改和删除的执行而没有提示信息,就不好了。
=============
在我回复computerdragon(dragon)的时候没看到你回复,您的回复我很关心,这正是我想了解的,但我在对表和行加了锁的时候,出现了上面的情况(在我对computerdragon(dragon)的回复中描述了),
请问,是不是某个表或行用Lock命令加了锁后,程序其它的所有SQL语句是不是都得加上请求锁的信息?不然,是什么其它原因?
通常做法三种:
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