db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Daniel John Debrunner <...@apache.org>
Subject Re: When is a new StatementContext pushed?
Date Fri, 24 Mar 2006 06:16:51 GMT
Mamta Satoor wrote:

> Hi,
> I am curious if there is some rule about when does the Derby engine push
> a new StatementContext? I have tried couple examples and noticed few
> cases where a new StatementContext is pushed and later popped.
> 1)When a user gives a sql statement and if it is not in the cache, then
> during the compilation phase, a StatementContext is pushed and at the
> end of compilation, the StatementContext is popped. When the execution
> phase starts for the statement, a new StatementContext is pushed and at
> the end of execution, the StatementContext is popped.
> 2)When the user moves in a JDBC ResultSet with next/first/last etc, a
> StatementContext is pushed and popped around the ResultSet movement code.
> 3)If a trigger is defined on a dml statement, trigger execution has its
> own StatementContext.
> My question is when is there a need to push a new StatementContext
> rather than using an existing one?

I believe StatementContext's are there to mainly handle statement
cleanup. Statements in SQL are atomic, either all the statement occurs
or none of it. Thus an INSERT statement that inserts five rows but fails
on the third due to a unique constraint violation, needs to rollback and
cleanup all the effects of that statement.

If a statement calls another statement, e.g. a function call from an
INSERT statement that performs server side JDBC then a statement level
exception in the server-side JDBC needs to only rollback the changes and
cleanup from the effect of the server-side JDBC statement, it must not
cleanup the outer INSERT statement.

In the Java method for the function, the application code can either
catch the exception and continue, or allow the exception to be thrown
into the databsae engine. In the first case the outer INSERT statement
needs to continue successfully, hence the limiting of the cleanup to the
server-side statement. In the second case the INSERT must be also rolled
back due to the exception, but now it's handled as a separate statement
level cleanup of the INSERT statement.

So I think the current simple model is that each statement pushes a
StatementContext when it is executing so that it can be rolled back
individually, even though in some cases (a trigger) the failure of the
inner statement may also cause the outer statement to be rolled back as
Not sure how this actually works for a trigger.

The alternate would be to have nesting counts within a StatementContext,
which would also require (possibly) StatementContexts to be owned by
statements. Currently StatementContexts are just temporarily owned by
the statement while it is executing.


View raw message