Thanks, that helped. The problem was not related to Derby (it actually had to do with Java garbage collection).
Yes, once your commit() returns, you can be sure your transaction is complete. Derby does most of the work using the user thread that invokes a JDBC request. There are some background threads, like the postCommit thread, but these should be transparent to users.
If you can monitor which thread is actually running during the lockup period, that might help ..