11

はい!私はドキュメントを読みました

  • jOOQ が接続でコミットまたはロールバックすることはありません (インポート API で明示的に構成されている場合、CSV インポートを除く)
  • jOOQ がトランザクションを開始することはありません。
  • ...

しかし、トランザクション管理が必要な場合、これを行うためのベストプラクティスは何ですか?

私はJOOQのやり方の大ファンだと言ったことがありますか?

4

3 に答える 3

12

この質問は、jOOQ がまだトランザクション API を実装していないときに尋ねられました。jOOQ 3.4以降、そのようなAPIが利用可能になり、ここに文書化されています:

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

トランザクション API とその JDBC へのデフォルト バインディング

デフォルトでは、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ネストされたトランザクションの開始時に が作成され、ネストされたトランザクションが通常の完了時にセーブポイントを破棄するか、例外時にそこにロールバックする場合。

デフォルトの JDBC バインディングのオーバーライド

多くのアプリケーションでは、JTA や Spring TX などの既存のトランザクション管理システムが既に存在します。この場合、次のいずれかを実行できます。

  • jOOQトランザクションAPIを一切使用しない
  • 、、および操作TransactionProviderのセマンティクスを実装する独自のものを実装します(Spring にバインドするなど)。begin()commit()rollback()
于 2013-03-02T09:29:07.867 に答える
5

トランザクション制御は、JOOQが提供するようなDBアクセス層から独立しています。

トランザクションの開始と終了は、おそらくアプリケーションのサービスレイヤーで最も適切に処理されます。そのページの図を参照して、サービスレイヤーとそれが呼び出す下位レイヤーとの関係を示します。

作業単位トランザクションスクリプトなどのパターンも参照してください。

于 2013-03-02T09:36:03.590 に答える
0

このリンクからこれを行う簡単な方法を見つけることができました: http://blog.liftoffllc.in/2014/06/jooq-and-transactions.html

この回答により、より詳細な説明が得られる場合があります: https://stackoverflow.com/a/24380508/542108

于 2014-06-24T07:24:14.270 に答える