はい!私はドキュメントを読みました
- jOOQ が接続でコミットまたはロールバックすることはありません (インポート API で明示的に構成されている場合、CSV インポートを除く)
- jOOQ がトランザクションを開始することはありません。
- ...
しかし、トランザクション管理が必要な場合、これを行うためのベストプラクティスは何ですか?
私はJOOQのやり方の大ファンだと言ったことがありますか?
はい!私はドキュメントを読みました
- jOOQ が接続でコミットまたはロールバックすることはありません (インポート API で明示的に構成されている場合、CSV インポートを除く)
- jOOQ がトランザクションを開始することはありません。
- ...
しかし、トランザクション管理が必要な場合、これを行うためのベストプラクティスは何ですか?
私はJOOQのやり方の大ファンだと言ったことがありますか?
この質問は、jOOQ がまだトランザクション API を実装していないときに尋ねられました。jOOQ 3.4以降、そのようなAPIが利用可能になり、ここに文書化されています:
https://www.jooq.org/doc/latest/manual/sql-execution/transaction-management
デフォルトでは、jOOQ はその (ネストされた) トランザクション サポートを、シンプルで機能的な API を介して直接 JDBC 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
ネストされたトランザクションの開始時に が作成され、ネストされたトランザクションが通常の完了時にセーブポイントを破棄するか、例外時にそこにロールバックする場合。
多くのアプリケーションでは、JTA や Spring TX などの既存のトランザクション管理システムが既に存在します。この場合、次のいずれかを実行できます。
TransactionProvider
のセマンティクスを実装する独自のものを実装します(Spring にバインドするなど)。begin()
commit()
rollback()
トランザクション制御は、JOOQが提供するようなDBアクセス層から独立しています。
トランザクションの開始と終了は、おそらくアプリケーションのサービスレイヤーで最も適切に処理されます。そのページの図を参照して、サービスレイヤーとそれが呼び出す下位レイヤーとの関係を示します。
作業単位やトランザクションスクリプトなどのパターンも参照してください。
このリンクからこれを行う簡単な方法を見つけることができました: http://blog.liftoffllc.in/2014/06/jooq-and-transactions.html。
この回答により、より詳細な説明が得られる場合があります: https://stackoverflow.com/a/24380508/542108