ADO中多用户操作同一数据库表时,事务控制问题! 我使用ADO编写的一个软件,单用户操作时,不存在问题。涉及的操作是一个流水表,两个明细表。但是启动两个程序同时录入操作时,后录入的数据无法POST到数据库表里,我使用的ADOConnection,ADOTable都使用的标准属性设置,请教如何设置以便实现多用户操作,互相不冲突! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不到万不得一的时候不用ADOTable 这样好像不行了,用adoquery不行吗? ADOConnection.beginTrans;try//TODO your codeADOConnection.commitTrans;ExceptADOConnection.rollbacktrans;end;建议不使用ADOTable 哦!大家还不了解,我使用的是ADOQuery,实际上是与ADOTable连接的同一个表对ADOQuery的维护实际上影射到了ADOTable里,我想实现ADOQuery的缓存更新,可是ADOQuery没有缓存更新好象。(*开启事务*)ADOconnection.BeginTrans;with AdoQuery dobegin Close; sql.clear; sql.add(' select * from 表名 where 1=2 '); Open; (*维护表数据*) Apend; FieldByName('字段名').AsString:='字符串'; try Post; (*特别注意:当第1个用户未提交或回滚,第2个用户在此无限等待*) except end;end;(*提交事务*)try ADOconnection.CommitTrans;exceptend;当然我的代码只是个模型,请大家关注我特别提示的地方,如何避免这种错误 你干嘛不直接INSERT INTO 语句呢? ADOConnection里面有个时间设定,默认好像是30秒你试试改小一点,反应会快。另外建议在语句中加上去鼠标的外观改变,以提示用户。 TO:longtusoft(开泰) 哎呀 我如果使用INSERT INTO,则事务会自动提交,如果其他表的更改出错,怎么回滚事务呀~ 我想过用TABLE,但是需要过滤数据,很麻烦 例如:有一处方编号表,存放当前最新处方编号 A用户登陆系统,得到处方编号,然后开始事务,录入费用明细,最后写一条流水记录,然后更新处方编号表以便下次使用,最后是提交事务。 问题是:A用户开启事务后,未提交,未撤消,B用户又启动同一程序进入该模块,开始事务,然后录入数据时,POST时,处于无限等待状态,除非A用户提交或撤消,B的明细数据才能入库。 大家不妨试试,真心求教! 建义用SQL 语句来完成。最后不要用APPEND这样的东西用SQL SERVER的 INSERT INTO如果不带返回值的时候保存就用ExecSQL保存 你把ADOQUERY里的LOCKTYPE属性改为ltBatchOptimistic只有在OPEN或者EXECSQL后你输入的结果才会保存到表中去的。。相当于一个缓存功能 说实话,我觉得 loon1981(懒家伙) 说的才有点道理,其他人的提议都不解决实际问题,因为用SQL语句直接更新数据库就无法控制多表事务,其实就应该和ADOConnection ADOTable AdoQuery的属性设置有关系,比如ADOConnection的事务级别、ADOTable AdoQuery的LOCKTYPE等等,但是我不知道应该设置为什么样才好 问题已经解决,基本上用的是LOCKTYPE属性为ltBatchOptimistic进行缓存更新的,谢谢大家 最近下了个delphi2007,听说出了D7最多人用的就是2007了,求帮助 全局变量怎么搞? dbgrid在win98下不能使用 各位大哥,用API什么函数可以判断现在是在WINDWOS界面中还是在我自已的程序界面中 怎样判断OleVariant是否为空? 如何能够读取.x文件到组件里 我把报表转换为bmp图片再去打印,原来的纸就打印不下了,有什么办法解决呢? 关于progressbar的问题? 怎样限制一个程序运行的个数? 关于Interbase日期查询问题,高手请进 请高手指点错误原因! ADOQuery Update 语法问题(总是没有弄明白)
try
//TODO your code
ADOConnection.commitTrans;
Except
ADOConnection.rollbacktrans;
end;建议不使用ADOTable
对ADOQuery的维护实际上影射到了ADOTable里,我想实现ADOQuery的缓存更新,可是ADOQuery没有缓存更新好象。(*开启事务*)
ADOconnection.BeginTrans;with AdoQuery do
begin
Close;
sql.clear;
sql.add(' select * from 表名 where 1=2 ');
Open; (*维护表数据*)
Apend;
FieldByName('字段名').AsString:='字符串';
try
Post; (*特别注意:当第1个用户未提交或回滚,第2个用户在此无限等待*)
except
end;
end;(*提交事务*)
try
ADOconnection.CommitTrans;
except
end;当然我的代码只是个模型,请大家关注我特别提示的地方,如何避免这种错误
另外建议在语句中加上去鼠标的外观改变,以提示用户。
哎呀 我如果使用INSERT INTO,则事务会自动提交,如果其他表的更改出错,怎么回滚事务呀~ 我想过用TABLE,但是需要过滤数据,很麻烦 例如:有一处方编号表,存放当前最新处方编号
A用户登陆系统,得到处方编号,然后开始事务,录入费用明细,最后写一条流水记录,然后更新处方编号表以便下次使用,最后是提交事务。
问题是:A用户开启事务后,未提交,未撤消,B用户又启动同一程序进入该模块,开始事务,然后录入数据时,POST时,处于无限等待状态,除非A用户提交或撤消,B的明细数据才能入库。
大家不妨试试,真心求教!
最后不要用APPEND这样的东西
用SQL SERVER的 INSERT INTO
如果不带返回值的时候保存就用ExecSQL保存
只有在OPEN或者EXECSQL后你输入的结果才会保存到表中去的。。
相当于一个缓存功能