大型数据库的开发[讨论],本贴不用结束,直接面对的都是大家遇到的可能是最小的也是最大的问题...... (100分)

  • 主题发起人 主题发起人 yym
  • 开始时间 开始时间
Y

yym

Unregistered / Unconfirmed
GUEST, unregistred user!
我看过一些大型的数据库系统如进销存类的,在对数据库一般指[sqlserver]
1.进行操作时,有使用如下方法.
Try
query.Edit;
Excepte
On E:Exception Do
Begin
ShowMessage('数据库保存出错');
Exit;
End;
end;
如果多个QUERY同时保存呢?回滚有效吗?
而没有用到 updatesql的控件,到底用updatesql控件不好吗?
难道不会产生多用户冲突吗?
我自己在使用加了updatesql控件后有时会产生讨厌的死锁问题而不能进行数据回滚,
有次进入修改模式,比如有一删除的操作后,保存就死锁,为单用户调试.后来找到的
原因是在显示窗体时不加EDIT即可,[莫名其妙,这种方法在这个程序中可以,而在其他
程序中如果死锁后却不行,难道是BDE的问题]

2.如果使用多个DATABASE时其中有一个成功,其他会不会产生事务不返回的情况
或在建多个DATABASE时应如何综合处理比较合适。
如:try
database1.StartTransaction;
database1.StartTransaction;
保存;
database1.commit;
database2.commit; 如果在此句出错,database1是否可以回滚?
except
回滚;
end;
3.StartTransaction;
update query1; //第一个表
关闭数据库再加入SQL语句
update query1; //第二个表
异常处理回滚等。
是否可以同时回滚所有数据?

大家讨论讨论与此相关的问题...............................................
 
看了你说的问题,头脑里第一个反映就是你的代码有问题。。。。

这种情况通常都是你写错了什么。。。
 
示例程序如下:
建一主从表,加入updatesql
主Form 中
从Form.masterquery.edit;
从Form.showmodal;
从Form中
detailquery.delete;
保存即死锁,去掉前一个EDIT即OK。
 
query直接进行edit没有updatesql能行?
rollback是针对事务的。
死锁是由于sql server用的页级锁,在query中加入(nolock)可以部分解决问题。
 
示例程序如下:
建一主从表,加入updatesql
主Form 中
从Form.masterquery.edit;
从Form.showmodal;
从Form中
detailquery.delete;
保存即死锁,去掉前一个EDIT即OK。
保存:
database.StartTransaction;
try
detailquery.applyupdates;
masterquery.applyupdates;
database.commit;
except
showmessage('出错');
database.rollback;
raise;
end;
detailqeury.commitupdates;
masterquery.commitupdates;

在query中加入unlock 也早用过了,没效果。
 
一. "原因是在显示窗体时不加EDIT即可"
这说明数据库此时已经处于EDIT状态了,

你应该再从
“主Form 中
从Form.masterquery.edit;
从Form.showmodal;
从Form中
detailquery.delete;”
以前的程序段中找找原因。

二. 还有你建立的是主从表结构,这时要修改信息时会牵扯到两个表,
你似乎是要在“从表”(detailquery.delete)中删除,却把主表改成了
edit(Form.masterquery.edit)状态, 那“从表”呢 ?

三.你用的是什么数据库,你能肯定是数据库本身发生了死锁故障吗?
一般应该只是访问程序本身的问题。
 
谢谢各位兄弟:
在EDIT时两个QUERY同时加也一样,就只有那么几句程序,没别的。怪吗?
我的用的是MSSQLSERVER7.0
 
用MSSQLSERVER出现一些怪东东不出奇呀;
如象你这样的用database1.StartTransaction;是一个非常好的方式,把所有表的修改包含在
try 里面,一有什么错误就可以回滚,所有表的数据恢复

 
多人接受答案了。
 
后退
顶部