[ 
https://issues.apache.org/jira/browse/DERBY-3115?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12543789
 ] 

Daniel John Debrunner commented on DERBY-3115:
----------------------------------------------

To really follow the JDBC spec I think what is needed is:

 3) If Connection.close() leads to a statement being completed (JDBC 4 section 
10.1) then a commit should be triggered.
      If Connection.close() does not lead to a statement being completed then 
no commit is triggered, if a transaction is active an exception is thrown 
following SQL Standard 17.3 GR 6

This approximates 1a) but is strictly not the same, and thus simply putting a 
commit in Connection.close() is not the same. 

This may be somewhat further confused by the rules for statement completion 
have changed from JDBC 3 to JDBC 4.
JDBC 3 includes that a statement is completed when "another Statement object is 
executed on the same connection" (section 10.1),
but this line was removed in JDBC 4.

Thus this code behaves differently in JDBC 3 & 4

ResultSet rs1 = ps1.executeQuery();
ResultSet rs2 = ps2.executeQuery();

JDBC 3 will commit & close rs1 when rs2 is created
JDBC 4 seems to indicate that both those ResultSets are open and can be used 
within a single auto-committed transaction. The transaction will be committed 
when rs1 or rs2 closes, whichever happens first.

Note that Derby implements JDBC 3 in that it performs a commit (in auto-commit) 
on any execution within the connection. I wonder if JDBC 4 intended to make 
this change in behaviour.




> With embedded driver and autocommit, when closing a connection, updates on 
> updatable result set are lost, unless result set is closed
> -------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-3115
>                 URL: https://issues.apache.org/jira/browse/DERBY-3115
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.3.1.4
>            Reporter: Dag H. Wanvik
>         Attachments: Main.java
>
>
> With autocommit, if an application neglects to close the result set
> and/or the statement, the closing of the connection will lose any
> updates performed via an updatable result set.
> If autocommit is false, SQL state 25000 invalid transaction state will
> be thrown, however.
> The JDBC standard requires that statements be closed when the
> connection is closed, cf.  JDBC 4, section 9.4.4: "All Statement
> objects created from a given Connection object will be closed when the
> close method for the object is called."  For updatable result sets,
> closing the statement would lead to a closing of the result set, and
> hence a commit of the updates.
> For the network client it works as expected.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to