这样的啊,你把那个连接对象封一下,加一个是否执行成功属性,自己写一个exec方法,在执行sql之前都开户事务(这里开启事务、提交事务都可以单独写成方法),同是返回那个连接对象,及改变(是否执行成功属性)的值(现在假设失败为false); 调用; con1:=exec(sql1); con2:=exec(sql2); con3:=exec(sql3); con4:=exec(sql4); b:=con1.flag and con2.flag and con3.flag and con4.flag; //以下可以写成通用方法,如数组,集合之类,统一处理。 if b then begin con1.commit; con2.commit; con3.commit; con4.commit; end else begin con1.rollback(); con2.rollback(); con3.rollback(); con4.rollback(); end;
楼主提出的方案,在不同的线程(不同的连接)中代码,构成事务,好象不可取。尚未见到实例。
构成事务的几个SQL语句,是抱团执行,不好分割。建议利用ADO提供的事务处理功能adoconnection1.begintrans; // 开始事务try adoconnection1.execute(sqlstr1); adoconnection1.execute(sqlstr2); ... adoconnection1.execute(sqlstrN); adoconnection1.commitrans; // 提交事务 showmessage('操作成功');except adoconnection1.rollbacktrans; // 事务回滚 showmessage('操作失败');end;
如果需要线程,可以将上述代码装进一个线程中执行。
try
adoconnection1.execute(sqlstr1);
adoconnection1.execute(sqlstr2);
...
adoconnection1.execute(sqlstrN);
adoconnection1.commitrans; // 提交事务
showmessage('操作成功');
except
adoconnection1.rollbacktrans; // 事务回滚
showmessage('操作失败');
end;
execsql(...);
execsql(...);
committran;但是,如果是连接应用服务器的情况(或者在利用多线程执行 execsql),因为没法确保每次 execsql 均使用同一个 connection ,这就造成了 begintran 没法用。所以就问这个问题,是不是多个 connection 没法使用同一个事务,只能想办法避免是吧?
咋不用FireDAC、DataSnap技术
调用;
con1:=exec(sql1);
con2:=exec(sql2);
con3:=exec(sql3);
con4:=exec(sql4);
b:=con1.flag and con2.flag and con3.flag and con4.flag;
//以下可以写成通用方法,如数组,集合之类,统一处理。
if b then
begin
con1.commit;
con2.commit;
con3.commit;
con4.commit;
end
else
begin
con1.rollback();
con2.rollback();
con3.rollback();
con4.rollback();
end;