This depends on your DataSource. jOOQ will always call
ConnectionProvider.acquire() each time it needs a JDBC Connection, and it
will call ConnectionProvider.release() when the Connection is no longer
needed.

By default, since you're passing a DataSource to the Configuration, the
DataSourceConnectionProvider is used, which maps to:

- acquire() : DataSource.getConnection()
- release() : Connection.close()

As you can see now, while jOOQ offers a transaction API, chances are that
you might have to properly implement the various SPIs (specifically:
ConnectionProvider, TransactionProvider) to properly bind to your backing
data source semantics. Usually, the defaults work well out of the box.

Hope this helps,
Lukas

2017-06-08 12:53 GMT+02:00 Marcus Gattinger <[email protected]>:

> Another question related to correct transaction handling: Does
> DSL.using(DEFAULT_CONFIGURATION) always return the same JDBC connection
> that is used by jOOQ to query the database? Otherwise transaction isolation
> comes into play, so e. g. new inserted but not yet committed rows are not
> visible within the save() methods of other repositories.
>
>
> Am Donnerstag, 8. Juni 2017 11:40:17 UTC+2 schrieb Marcus Gattinger:
>>
>> Hi user group,
>>
>> I'm evaluating jOOQ now for a while and struggle about transaction
>> handling.
>>
>> Currently we use Hibernate in our software and the transaction handling
>> works like this:
>> We have a Service that is used to begin and commit/rollback a new
>> transaction, but only if no transaction has been started.
>>
>> public void applyInTransaction(final Consumer<HibernateService> action, 
>> final SharedSessionContract session) {
>>     Transaction tx = null;
>>     try {
>>         // Start a new transaction if action is executed outside of a 
>> transaction.
>>         if (session.getTransaction() == null || 
>> !session.getTransaction().getStatus().isOneOf(TransactionStatus.ACTIVE)) {
>>             tx = session.beginTransaction();
>>         }
>>
>>         action.accept(this);
>>
>>         // Commit the transaction if it has been started locally.
>>         if (tx != null) {
>>             tx.commit();
>>         }
>>     } catch (Exception ex) {
>>         // Rollback the transaction if it has been started locally.
>>         if (tx != null) {
>>             tx.rollback();
>>         }
>>         throw ex;
>>     }
>> }
>>
>>
>> As you can see, we use the Hibernate-Session here (i. e. an instance of
>> the SharedSessionContract) to decide whether to begin a new transaction or
>> not (i. e. there is already a running transaction).
>> As a result, the transaction is only committed / rolled back if the
>> outmost action has finished. This allows us to use transaction handling on
>> any place within our application. Any further inner actions invoked after
>> the outer action has been started will "expand" the transaction context. To
>> summarize it: At any time only one transaction is started that might cover
>> any number of actions.
>>
>> So how can I migrate this behaviour to jOOQ (ideally using only jOOQ
>> itself, no Spring etc.)?
>>
>> My prototype that I'm using to evaluate jOOQ, I have several
>> repositories, each one have a save() method. If a save() method of one
>> repository calls a save() method on another repository, I want to commit /
>> rollback all those changes after the first (outmost) save() method has
>> finished. You can I achieve this? I already have searched the threads in
>> this user group and read the jOOQ documentation but have not found anything
>> that points me in the right direction.
>>
>> By the way - a typical repository save() method looks like this:
>>
>> public Client save(final Client client) {
>>     getContext().transaction(configuration -> {
>>         ClientRecord record = client.getRecord();
>>         record.attach(configuration);
>>         if (record.getId() == null) {
>>             record.insert();
>>         } else {
>>             record.update();
>>         }
>>         // further save() methods of other repository might be called
>>     });
>>     return client;
>> }
>>
>>
>> And the call to getContext() which is a method of the repository base
>> class looks like this:
>>
>> private static final Configuration DEFAULT_CONFIGURATION = new 
>> DefaultConfiguration()
>>         .set(DataSource.get())
>>         .set(SQLDialect.MYSQL)
>>         .set(new 
>> Settings().withRenderSchema(false).withRenderCatalog(false));
>>
>> protected DSLContext getContext() {
>>     return DSL.using(DEFAULT_CONFIGURATION);
>> }
>>
>>
>> If any further information is required to clarify my request, do not
>> hesitate to ask for that.
>>
>> Kind regards,
>> Marcus
>>
> --
> You received this message because you are subscribed to the Google Groups
> "jOOQ User Group" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "jOOQ 
User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to