请教各位高手:有关事务处理的问题(100分)

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

yukuang

Unregistered / Unconfirmed
GUEST, unregistred user!
是这样的,在我的程序中我显式的使用了事务处理

try
Database.Starttranscation;
StoredPorc1.ExeProc; //问题在这一句。下面的A

//下面还有很多数据处理工作
except
rollback
end;

Database.Commit;

A:我在上句中的存储过程内部也使用了事务处理。可是当后面的语句错误时,我只能rollback database的事务。storproc内的数据却因没有问题而插入到数据库中了。这显然不符合我的要求,那该怎么办呢?是否这样???????????:
try
Query1.SQL.Add('Exec proc....');
except
Database.rollback;
end;

还有什么好办法吗?就是两个事务能否相互控制?
 
If the outer transaction is committed,
the inner nested transactions are also committed.
If the outer transaction is rolled back,
then all inner transactions are also rolled back,
regardless of whether or not the inner transactions were individually committed.

--sql server books online
说的很清楚,只要外层事务回滚,里层事务无论是否提交都会被回滚,不知道你用的是
sql server?
不过应该都会有类似的嵌套事务。另外有一些操作是不能在事务里执行的。一旦执行则所
有操作立即自动提交。不知道你在存储过程和后面的程序里做了些什么?
 
我只是奇怪既然你要求要不全部提交,要不全部滚回,那么你的存储过程为什么要COMMIT????
应该是存储过程也仅仅执行SQL语句而已。当你无论程序部分还是存储过程部分都正常后
再一次对数据库连接做COMMIT处理。事务处理本身的含义就是这个。
你的那个做法是违背事务的本质的。
 
Database.Starttranscation; 应放在Try语句前面。
Database.Commit; 应放在except 之前。
Query1.SQL.Add('Exec proc....'); 应放在前面的Try里面。
 
请问“第一士人”:什么样的操作不能在事务里面执行?一旦执行则所有操作自动提交
 
既然你没有否认我只能认为你用的是sql server ,从6.5开始,sql server对这方面的限制
好象已经没有了,如果你用的是oracle 或 sql anywhere等,那么在进行alter,create等
操作的时候,所有此操作以前的操作立即commit;
另外我刚才试了一下,
//
create table t_test
(
f_a varchar(2)
)
//
create procedure P_xxx
as
begin transaction
insert into t_test values ('a')
commit;
//
Database1.StartTransaction;
StoredProc1.ExecProc;
database1.Rollback;
数据并没有进入表中,不知道你是怎么做的?

 
我也踫到類是的問題,我沒有找到辦法,我想原因是存儲過程是已經過編譯國的,他与妳外層
的事務沒有在一編譯,所以沒有回歸滾
 
多人接受答案了。
 

Similar threads

后退
顶部