Subject | Re: [IBO] Transactions |
---|---|
Author | Robert martin |
Post date | 2005-10-19T02:14:39Z |
Wow.
Thanks for the detailed response Helen.
series of DSQL requests. The issues have been occurring under load.
situation correctly. However as code changes are required it would make
sense (to us) to deal with the problem areas first and test before
moving to other areas. So I mean, not dropping all existing code and
rewriting it in one go, but correcting one area at a time. Hope that
makes sense.
example you suggest retrying if a lock occurs. The 'structure' I see
for this might be something like...
t.StartTransacion;
//processing code here
.....
repeat
try
t.Commit;
SuccessfullyCommited := true;
except
//Is this a lock situation?
Dec(CommitRetries);
Sleep(500);
end
until (SuccessfullyCommited = True) or (CommitRetries = 0);
Is this a valid layout or is there a better structure?
this task.
if I was working with a new app instead of a large existing app.
Thanks Helen
Rob Martin
Software Engineer
phone +64 03 377 0495
fax +64 03 377 0496
web www.chreos.com
Wild Software Ltd
Thanks for the detailed response Helen.
>OK, let's start by understanding that, in principle, these are not "errors"Got it. Thats what we want to do.
>(something that you have to avoid) but EXCEPTIONS. They are perfectly
>normal responses in a multi-transaction environment. It is just the server
>doing its job. What you need to do is catch these exceptions and handle
>them in whatever way gets you to the solution you need.
>
>
>
>Sure, a retry loop is a good way to manage exceptions; but it's notNot an option for us, but a valuable idea for other applications.
>necessary under all circumstances to kill the transaction. If the
>applications that the conflicting users are running are all managing
>throughput efficiently, and not running transactions that last for long
>periods, you can work out a "wait time" that doesn't disturb the user too
>much and tailor your retry loop to suit. A brief wait, with an explanatory
>message, is usually more acceptable to a user than forcing him/her to begin
>again from the beginning.
>
>
>
>Is that a stored procedure call, or a series of DSQL requests from the client?I is a large block of code running in multiple threads that runs a
>
>
>
series of DSQL requests. The issues have been occurring under load.
>Not clear what you mean by "incrementally".Obviously you are right that the whole app should be handling this
>
>
>
>
situation correctly. However as code changes are required it would make
sense (to us) to deal with the problem areas first and test before
moving to other areas. So I mean, not dropping all existing code and
rewriting it in one go, but correcting one area at a time. Hope that
makes sense.
>Rolling back is the most drastic way of handling a lock conflict. UnderWhat i meant by structures was kind of syntax / code layout. For
>some conditions, it will be what you want to do; in others, you will want
>to retry.
>
>
>
>By "structures", do you mean workflow?
>
>
>
example you suggest retrying if a lock occurs. The 'structure' I see
for this might be something like...
t.StartTransacion;
//processing code here
.....
repeat
try
t.Commit;
SuccessfullyCommited := true;
except
//Is this a lock situation?
Dec(CommitRetries);
Sleep(500);
end
until (SuccessfullyCommited = True) or (CommitRetries = 0);
Is this a valid layout or is there a better structure?
>In the transactional environment, Autocommit should be used with greatWill look into CommitRetaining :)
>restraint, and with a full understanding of the implications of
>CommitRetaining, which is what Autocommit uses to commit these
>transactions. It is not pretty; and it really does demand that you
>intervene periodically to make a "hard commit" on this long-lived
>transaction context.
>
>
>
>You should also understand the implications of using ReadCommittedWe are happy with ReadCommited. A snapshot view is not necessary for
>isolation for a task of many steps. More often than not, it will create
>the potential for inconsistencies, especially if you are passing variables
>through a chain of statements. If the task requires a consistent view of
>database state from start to finish, use Concurrency isolation.
>
>
this task.
>If you are using TIBODatabase, you are stuck with the internalWill do.
>transaction. My policy for multi-user apps is to make sure that it's a
>complete no-op. Drop in a TIBOTransaction and take care to set its
>IB_Connection property. Then, assign the IB_Transaction property of all
>the statements involved in the task to this transaction explicitly. You
>can re-use the same transaction for other task groupings but, if there's a
>chance that the user will need to run two task groups concurrently then
>have a separate transaction for each.
>
>
>
>A failed commit does not cause a rollback - simply the opportunity to waitYes the umbilical cord is proving tricky to remove. It would be easier
>(if it's a locking confict) or fix what's wrong (for other
>exceptions). But, of course, this means cutting your umbilical cord to the
>BDE way of doing things, which is to dumb-down multi-transaction processing
>so that the developer has the illusion that he is using Paradox or dBase on
>his own desktop harddrive.
>
>
>
if I was working with a new app instead of a large existing app.
>Well, sorry, no magic bullet here, but I do advise making it a priority toDamn. I feel I might need a bullet today :)
>understand how transactions work and what the various locking exceptions
>mean in the overall scheme of things. If you haven't visited the TechInfo
>page yet, today would be a good day to do that. :-)
>
>
>
Thanks Helen
Rob Martin
Software Engineer
phone +64 03 377 0495
fax +64 03 377 0496
web www.chreos.com
Wild Software Ltd