Как начать транзакцию и выполнить откат с JOOQ?

Да! Я прочитал документы о

  • jOOQ никогда не выполнит фиксацию или откат соединения (кроме CSV-импорта, если он явно настроен в API импорта)
  • jOOQ никогда не начнет никаких транзакций.
  • ...

но когда мне нужно какое-то управление транзакциями, что лучше для этого делать?

Разве я сказал, что я большой поклонник способа JOOQ!

3 ответа

Этот вопрос был задан в то время, когда jOOQ еще не реализовал API транзакций. Начиная с jOOQ 3.4, такой API доступен и документирован здесь:

https://www.jooq.org/doc/latest/manual/sql-execution/transaction-management

API транзакции и его привязка по умолчанию к JDBC

По умолчанию jOOQ связывает свою (вложенную) поддержку транзакций с JDBC API напрямую через простой, функциональный API:

DSL.using(configuration)
   .transaction(c -> {
        c.dsl().insertInto(...).execute();
        c.dsl().update(...).execute();
   });

... лямбда-выражение (или, более конкретно, TransactionalRunnable) создает новую транзакцию в начале и фиксирует ее при нормальном завершении или откатывает ее при исключении.

Такие транзакции могут быть вложенными

DSL.using(configuration)
   .transaction(c1 -> {
        c1.dsl().insertInto(...).execute();
        c1.dsl().transaction(c2 -> {
            c2.dsl().insertInto(...).execute();
        });
        c1.dsl().update(...).execute();
   });

... в случае чего Savepoint будет создан в начале вложенной транзакции, и вложенная транзакция сбрасывает точку сохранения при обычном завершении или откатывается к ней при исключении.

Переопределение привязки JDBC по умолчанию

Во многих приложениях у вас уже будет существующая система управления транзакциями, например, JTA или Spring TX или что-то еще. В этом случае вы можете:

  • Не использовать API транзакций jOOQ вообще
  • Реализуйте свой собственный TransactionProvider который реализует семантику begin(), commit(), а также rollback() операции, например, связывая их с Spring.

Управление транзакциями не зависит от уровня доступа к БД, такого как JOOQ.

Начало и завершение транзакций, вероятно, лучше всего обрабатывать на уровне обслуживания вашего приложения. Смотрите диаграмму на этой странице, показывающую отношение уровня сервиса к нижним уровням, которые он вызывает.

См. Также шаблоны, такие как Единица работы или Сценарий транзакции

Я мог бы найти простой способ сделать это по этой ссылке: http://blog.liftoffllc.in/2014/06/jooq-and-transactions.html.

Этот ответ может дать вам более подробное объяснение: /questions/20696536/jooq-i-tranzaktsii/20696560#20696560

Другие вопросы по тегам