2016-06-30 10 views
1

私は、コードブロックの範囲外私のトランザクションを制御したいと思いますしかし、私はこのJOOQ取引

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

ようDSLContextとラムダとDefaultTransactionProviderを使用することができることを認識して(まだ使用しています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コンシューマとしての直接アクセス用に設計されていません。これらは、ConfigurationのjOOQ SPIコンテキストへの実装と注入用に設計されています。このパスを継続したい場合は、TransactionProviderConfiguration.connectionProvider()にアクセスし、commit()またはrollback()が呼び出されるまで常に正しい接続を生成するために状態を変更する必要があります。

はjOOQユーザーグループにも関連する説明を参照してください。 https://groups.google.com/forum/#!msg/jooq-user/1JwWMChD2SM/NHUhSnI8AgAJ

+0

おかげで、私はその機能に目を離さないでしょう。 – kag0