2016-06-30 2 views
1

Я знаю, что я могу использовать DefaultTransactionProvider с DSLContext и лямбды, как этотJOOQ операции с DefaultTransactionProvider без функций

DSL.using(configuration) 
    .transaction(ctx -> { 
     DSL.using(ctx) 
      .update(TABLE) 
      .set(TABLE.COL, newValue) 
      .where(...) 
      .execute(); 
}); 

Однако я хотел бы контролировать свои сделки за рамки блока кода (но все-таки с помощью DefaultTransactionProvider, поскольку его поведение с контрольной точкой и вот что я ищу). Более того, это

configuration.transactionProvider().begin(transactionContext); 
DSL.using(configuration) 
    .update(TABLE) 
    .set(TABLE.COL, newValue) 
    .where(...) 
    .execute(); 
configuration.transactionProvider().commit(transactionContext); 

Возможно ли это, или мне нужно будет осуществить транзакцию SPI самостоятельно для этого?

ответ

1

Начиная с версии jOOQ 3.8, это невозможно из коробки. Существует запрос ожидающей функции для этого: https://github.com/jOOQ/jOOQ/issues/5376

Вашего код будет, вероятно, работать:

configuration.transactionProvider().begin(transactionContext); 
DSL.using(configuration) 
    .update(TABLE)... 
configuration.transactionProvider().commit(transactionContext); 

Но нужно учитывать, что вы вызываете методы SPI, а не методы API. Эти методы не были предназначены для прямого доступа вами как потребителя API. Они предназначены для реализации и внедрения в контекст jQQ SPI в Configuration. Если вы хотите продолжить этот путь, то ваш TransactionProvider должен будет получить доступ к Configuration.connectionProvider() и изменить его состояние, чтобы обеспечить всегда правильное соединение до тех пор, пока не вызывается commit() или rollback().

Смотрите также связанное обсуждение группы пользователей jOOQ: https://groups.google.com/forum/#!msg/jooq-user/1JwWMChD2SM/NHUhSnI8AgAJ

+0

Спасибо, я буду следить за эту функцию. – kag0

Смежные вопросы