You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by Daniel John Debrunner <dj...@apache.org> on 2008/02/15 18:35:32 UTC

conn.rollback() in a procedure should not close the CallStatementResultSet - WAS Re: svn commit: r627673 - /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LangProcedureTest.java

Mamta Satoor wrote:
> I will soon make a checkin for the resultset from the procedure which
> shows that in trunk, after checkin 602991 for DERBY-1585, a procedure
> does not return a resultset if there was a rollbck inside the
> procedure with resultset creation before rollback. 

Thanks for finding the commit that caused it Mamta. Having made that 
change I had to look into why it changed the behaviour as that was not a 
intended part of the fix.

DERBY-1585 fixed the issue that unprocessed dynamic result sets (e.g. in 
a trigger) were not closed until gc, leading to an error trying to drop 
a table due to an open result set.

The fix (602991) changed it so that at the close of 
CallStatementResultSet any unprocessed dynamic result sets were closed. 
Thus the order is for a normal execution is:

    callStmtResultSet.open();
       calls the Java method for the procedure
            method creates & returns JDBC ResultSets
    embed statement processes dynamic result sets
    callStmtResultSet.close();
        no dynamic results to close since embed statement handled them

(and for a trigger embed statement is not involved so the 
callStmtResultSet.close closes any dynamic result sets)

Now if the procedure's method calls rollback() then this is the order:

callStmtResultSet.open();
       calls the Java method for the procedure
            method creates & sets JDBC ResultSets in parameter arrays
            rollback called()
                callStmtResultSet.close()
                    close all dynamic result sets <<<< NEW (DERBY-1585)
       embed statement processes dynamic result sets
       callStmtResultSet.close();
        no dynamic results to close since embed statement handled them

So the change occurred because the rollback caused the close of the 
CallStatementResultSet to be called which now closes all outstanding 
dynamic result sets and clears all references to them, making them 
invisible to any following embed statement processing, resulting in no 
dynamic results being returned.

Prior to 602991 even though the underlying language result of any 
dynamic jdbc result set was closed, the jdbc result set did not appear 
closed (actually due to something similar to DERBY-3404), thus embed 
statement processed it as an open result set and returned it. Any use on 
it failed (it was closed) as a different mechanism was used to check it 
was closed.

So I understand why DERBY-1585 (602991) changed the behaviour but I 
don't think the complete logic is correct. Much like a commit in a 
procedure was incorrectly closing the CallStatementResultSet (recently 
fixed by Mamta) I believe the rollback should not be closing the 
CallStatementResultSet. It's still being used and thus should remain 
open. Now a rollback due to an exception that causes the CALL statement 
to throw an exception should close the CallStatementResultSet, but if 
the CALL statement is returning then its CallStatementResultSet should 
not be closed.

Dan.

Re: conn.rollback() in a procedure should not close the CallStatementResultSet - WAS Re: svn commit: r627673 - /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LangProcedureTest.java

Posted by Mamta Satoor <ms...@gmail.com>.
I will look at special handling of resultsets that do not return rows
to stay open at the time of rollback unless the rollback is caused by
an exception, in which case, we want to close all the resulsets
whether they return rows or not.

Mamta

On 2/15/08, Daniel John Debrunner <dj...@apache.org> wrote:
> Mamta Satoor wrote:
> > I will soon make a checkin for the resultset from the procedure which
> > shows that in trunk, after checkin 602991 for DERBY-1585, a procedure
> > does not return a resultset if there was a rollbck inside the
> > procedure with resultset creation before rollback.
>
> Thanks for finding the commit that caused it Mamta. Having made that
> change I had to look into why it changed the behaviour as that was not a
> intended part of the fix.
>
> DERBY-1585 fixed the issue that unprocessed dynamic result sets (e.g. in
> a trigger) were not closed until gc, leading to an error trying to drop
> a table due to an open result set.
>
> The fix (602991) changed it so that at the close of
> CallStatementResultSet any unprocessed dynamic result sets were closed.
> Thus the order is for a normal execution is:
>
>    callStmtResultSet.open();
>       calls the Java method for the procedure
>            method creates & returns JDBC ResultSets
>    embed statement processes dynamic result sets
>    callStmtResultSet.close();
>        no dynamic results to close since embed statement handled them
>
> (and for a trigger embed statement is not involved so the
> callStmtResultSet.close closes any dynamic result sets)
>
> Now if the procedure's method calls rollback() then this is the order:
>
> callStmtResultSet.open();
>       calls the Java method for the procedure
>            method creates & sets JDBC ResultSets in parameter arrays
>            rollback called()
>                callStmtResultSet.close()
>                    close all dynamic result sets <<<< NEW (DERBY-1585)
>       embed statement processes dynamic result sets
>       callStmtResultSet.close();
>        no dynamic results to close since embed statement handled them
>
> So the change occurred because the rollback caused the close of the
> CallStatementResultSet to be called which now closes all outstanding
> dynamic result sets and clears all references to them, making them
> invisible to any following embed statement processing, resulting in no
> dynamic results being returned.
>
> Prior to 602991 even though the underlying language result of any
> dynamic jdbc result set was closed, the jdbc result set did not appear
> closed (actually due to something similar to DERBY-3404), thus embed
> statement processed it as an open result set and returned it. Any use on
> it failed (it was closed) as a different mechanism was used to check it
> was closed.
>
> So I understand why DERBY-1585 (602991) changed the behaviour but I
> don't think the complete logic is correct. Much like a commit in a
> procedure was incorrectly closing the CallStatementResultSet (recently
> fixed by Mamta) I believe the rollback should not be closing the
> CallStatementResultSet. It's still being used and thus should remain
> open. Now a rollback due to an exception that causes the CALL statement
> to throw an exception should close the CallStatementResultSet, but if
> the CALL statement is returning then its CallStatementResultSet should
> not be closed.
>
> Dan.
>