怎样处理SQL Server 的事务回滚? 比如同时UPDATE 两个表,更新一个,另一个没有更新,引起数据不一致?
解决方案 »
- StringGrid 同一个单元格 显示 不同颜色的字体
- THotKey的赋值问题
- Delphi命名规范,欢迎灌水-〉
- ADOQuery1的TAggregateField字段值怎么计算不出来?ACTION 已经设置成TRUE了
- ▲▼明天要面试几个程序员,大家看看这样问可以吗??还能问什么呢?
- 请问哪个大哥能告诉我有没有中文版的delphi6啊
- 我有两个listbox控件,我现在想把listbox1的内容逐条或全部,或选中的部分搬到listbox2中,请问怎么做啊
- 如何把.bmp或其他资源存在编译后的可执行文件中?
- 在现在这种国情下,盗版到底应不应该禁呢?
- 如何在打开一个窗口后立刻以SHOWMODAL的方式打开另一个窗体?
- 怎么用断点调试时看不出调试结果?方法是我没有用来,请你指点好吗?
- 老大帮忙啊!
try
query1.ApplyUpdates;
query2.ApplyUpdates;
query3.ApplyUpdates;
//... Database1.Commit; {on success, commit the changes};
except
Database1.Rollback; {on failure, undo the changes};
raise; {raise the exception to prevent a call to CommitUpdates!}
end;
query1.CommitUpdates; {on success, clear the cache}
query2.CommitUpdates; {on success, clear the cache}
query3.CommitUpdates; {on success, clear the cache}
//...
try
...
DataBase1.Commit;
except
DataBase1.Roolback;
end;只要事务回滚了,决不会出现你所说的数据不一致(哪怕是事务处理中突然断电了);要不然事务处理(Transaction)是干什么吃的,DBMS是干什么吃的。三层结构是一样的。只要你按上面的格式写事务处理,要么全部提交,要么全部不提交,这就叫事务的原子性。
cds1.ApplyUpdates(0);
就可以了,剩下的都是Delphi做了。
如果是多个表,那就麻烦了,参看D5DG的MIDAS章节,Dan Miser在其中很好的解决了。
如果想进一步控制,用这个事件好了
procedure TForm1.ClientDataSet1ReconcileError(
DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
beginend;
Try
ADOConnection.BeginTrans;{??}
...
ADOConnection.CommitTrans;{提交}
Except
ADOConnection.RollbackTrans;{回滚}
end;{Try}