alogrep 0 Posted September 1, 2024 HI. I have this scheme (pseudocode) rery+0 repeat starttransaction; try table1.edit;. change table1; table1 post; commit; except on E: SysUtils.Exception do begin Rollback; table1 cancel inc(retry); if retry>=3 then showmessage & exit else sleep(500); end; end; until retry>=3; end; In table1 OnPostError I have begin ACTION:=DAaBORT; end; Why do I get the error message (regarding a conflict with other users)? That defeats the purpose of the start transaction/commit/rollback setup. DaAbort should NOT show the message, correct? My intent is to retry the edit/post operation 3 times, but if a message shows up with one user, by the time it reads it and closes it, other concurrent users get a timeout error. Share this post Link to post
eivindbakkestuen 47 Posted September 3, 2024 On 9/2/2024 at 4:20 AM, alogrep said: OnPostError Notice the "Post" part? I'm guessing the error doesn't occur in .Post, but in .Edit. Share this post Link to post
Remy Lebeau 1472 Posted September 3, 2024 Your rollback and cancel calls are backwards. Since the transaction was started first, it should be rolled back last. Cancel the edit before you rollback. Consider using a 2nd try..except block to handle this correctly. You are also not breaking the loop if the transaction is successful. Try this instead: retry := 0; repeat starttransaction; try table1.edit; try change table1; table1.post; except table1.cancel; re-raise; end; commit; Break; except Rollback; inc(retry); if retry >= 3 then showmessage & exit else sleep(500); end; until False; Share this post Link to post