关于rollback(100分)

  • 主题发起人 主题发起人 千层血
  • 开始时间 开始时间

千层血

Unregistered / Unconfirmed
GUEST, unregistred user!
对数据库中的若干张表进行更新,为了达到对每张表都更新成功才commit 否则rollback
代码:
procedure TForm1.Button_applyClick(Sender: TObject);
begin
database1.StartTransaction ;
with table1 do//对ddg表添加数据
begin
Active :=False;
TableName :='ddg';
Active :=true;
Append ;
FieldByName('nam').AsString := inttostr(i);//全局变量 整形
FieldByName('dt').AsDateTime :=now;
FieldByName('dd').AsString :=inttostr(i);
FieldByName('num').AsInteger :=i;
try
Post ;
except
begin
Database1.Rollback ;
Application.Terminate ;
end;
end;
end;
with table2 do//对class表添加数据
begin
Active :=False;
TableName :='CLASS';
Active :=true;
Append ;
FieldByName('class_name').AsString := inttostr(i);
FieldByName('t_time').AsDateTime :=now;
FieldByName('class_id').AsString :=inttostr(i);
try
Post ;
except
begin
Database1.Rollback ;
Application.Terminate ;
end;
end;
end;
i:=i+1;
database1.Commit ;//只有当两长表都添加成功才commit
end;
使用:sql7数据库bde数据引擎
结果发现:表 ddg每次添加一条数据,而表 class每次 添加了两条数据(一条是准备加的,
一条是 前面ddg新家的数据),用sql monitor跟踪sql 语句,发现 向sql数据库只提交了
两条insert语句(ddg表一条 class表一条),
问题就是:class明明只post一条数据,为什么在表里加了两条数据?
 
没看出问题来.不过,提醒一点,你的try..except..end似乎不太好.
try
if database1.InTransaction then
database1.Commit;
database1.StartTransaction ;
Table1...
post;
Table2...
post;
database1.Commit;
except//这儿不需要begin...end;
database1.Rollback;
...
end;
你用断点的方法查查看,有没有执行其它的地方,再试一个烂招,你将两个表的顺序调一下,看
看Table1会不会新增两笔呢?若不能或还是Table2新增两笔,那一定是Table2哪儿有问题.你的
代码里面有个i,是不是在一个循环中.最好还是用断点查一下,一般来说不会莫名其妙的出这
这问题的.
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=947572
try
Database1.StartTransaction;
...//各种操作
database1.commit;
except
database1.rollback;
end;
 
多人接受答案了。
 
try
AdoConnection.BeginTrans;
...
post;//1

...
post;//2

AdoConnection.Commit;
except
AdoConnection.rollback;
end;
 

Similar threads

S
回复
0
查看
685
SUNSTONE的Delphi笔记
S
S
回复
0
查看
645
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部