On 31.05.10 14:55, Knut Anders Hatlen wrote:
On Mon, 2010-05-31 at 14:43 +0200, Knut Anders Hatlen wrote:
On Mon, 2010-05-31 at 09:46 +0200, Kristian Waagan wrote:
On 31.05.10 06:03, Hawkx wrote:
I found that derby do not auto commit data change on my computer, even I set
auto commit to true explicitly. nothing written to database, unless I call
commit().
Hi,
I think this is expected behavior, because you don't close the statement.
From [1] (* added by me):
"Auto-commit mode means that when a statement is completed, the method
/commit/ is called on that statement automatically. Auto-commit in
effect makes every SQL statement a transaction. The commit occurs when
the statement completes or the next statement is executed, whichever
comes first. *In the case of a statement returning a /ResultSet/, the
statement completes when the last row of the /ResultSet/ has been
retrieved or the /ResultSet/ has been closed explicitly.*"
When you call close Connection.close(), Derby will do a rollback because
there is an active transaction (if you had auto-commit set to false, an
exception would have been thrown).
I was under the impression that closing the connection would implicitly
close the statement, which would then lead to the transaction being
auto-committed and not rolled back.
From EmbedConnection's javadoc:
http://db.apache.org/derby/javadoc/engine/org/apache/derby/impl/jdbc/EmbedConnection.html#checkForTransactionInProgress%28%29
Check if the transaction is active so that we cannot close down
the connection. If auto-commit is on, the transaction is
committed when the connection is closed, so it is always OK to
close the connection in that case. Otherwise, throw an exception
if a transaction is in progress.
It turns out this problem is already logged in the bug tracker:
https://issues.apache.org/jira/browse/DERBY-3115
Hi Knut Anders,
Thanks for getting this right. I based my answer on a look at the code
in the embedded driver, not from the JDBC specification.
I have confirmed that the client driver behaves according to the
standard, and that the embedded driver doesn't (back to 10.2, where the
feature was introduced).
Is the paragraph referenced from the devguide accurate enough, or should
we change it?
There seems to be many fine details to handle related to this issue...
I now remember from working on the client driver that we do keep track
of open result sets there and close them explicitly on Connection.close().
--
Kristian