Как начать транзакцию и выполнить откат с 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