問題タブ [transactional]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
433 参照

spring - JPAエンティティの挿入をテストする方法はありますか?

  1. 問題は、永続エンティティが機能するかどうかをテストする方法についてです。特にカスケード属性(CascadeType.ALLなど)を持つ@ OneToMany / @ ElementCollection / @ ManyToMany / @ OneToOneを使用した複雑なエンティティマッピングの場合、JPAエンティティマッピングが正しく、すべてが期待どおりに機能するかどうかをテストすることは理にかなっていると思います。また、すべてのFK / PK/Unique制約が満たされていることを確認してください。

  2. これが一般的な質問です。具体的な部分は、SpringTestingFrameworkについてです。以下のコードで、DAOレイヤーがテストしていることがわかりますが、テストメソッドは@Transactionalとしてマークされているため、変更ロールバックする必要があります。これは、必須でなく、必須ではありません。確かに、変更は実際にデータベース全体で、トランザクションがロールバック用にマークされているため、おそらくすべてがメモリに保持されているため、データは実際にはデータベースに送信されませんか?

  3. さらに重要なのは、account.getId()が0を返すため(idの生成は@SequenceGeneratorを使用して行われる)、このテストが失敗することですが、この値がアカウントのidフィールドに割り当てられることはないようです。このテストは、メソッドに@Rollback(false)の注釈が付けられている場合にのみ合格するため、もちろんロールバックは発生しません。

  4. 確かに、この場合、テストに@Transactionalを使用すると、すべてがメモリ内にあるため(少なくとも、flush()が呼び出されない限り)、データベースの制約が機能していることを確認できません。

  5. そして、上記の考えによれば、エンティティの挿入をテストし、挿入が行われたことを確認してから、すべてを初期状態にロールバックして、他のテストを実行するための適切な方法は何ですか?(テストが実行されるたびに@Before内のデータベースをクリーンアップしますか?)

  6. 私はDBUnitを使いたくありません。Springを使うと、DBUnitを使う意味がまったくありません。

    /li>
0 投票する
0 に答える
232 参照

hibernate - マルチデータソース:1RW+多数のRO

読み取りおよび書き込み操作のセットを備えた単一のデータベース「dbMain」を備えたアプリがあります。

次に、SomeServiceImplで使用するために、読み取り専用操作用に追加のデータベースdb1-db10を使用して追加する必要があります。

問題は:

  • SomeServiceImplでいくつかのDAO(dbMainおよびdb1用)を使用する必要があります
  • tx:annotation-drivenで定義できるtransactionManagerは1つだけであり、@Transactionalはそれだけで動作します。
  • db1DAOを使用した操作で、SomeServiceImplでdb接続リークが発生することがありました。少なくとも@PostConstructinit(){...}

本当に、JTAを使いたくない。そのような環境を構成する適切な方法は何ですか?

追加のデータベース:

0 投票する
1 に答える
1319 参照

hibernate - Spring + Hibernate: トランザクション データソースと非トランザクション データソースを一緒に使用する

私のSpring 2.5.6 + Hibernateアプリでは、異なるスキーマを持つ複数のデータベースとの間でデータを読み書きする必要があります。アプリは Tomcat 上にあるので、本格的なアプリケーション サーバーに移行する必要がないように、当面は JTA を使用する必要はありません。

そこで、トランザクション データソースを 1 つだけ持つことにしました。私は他の人がトランザクションではないのと一緒に暮らすことができます。

しかし、どういうわけか私はそれを機能させることができません。私が間違っているかもしれないことについての手がかりを私に与えるために見てもらえますか?

これは私のapplicationContext.xmlです:

ご覧のとおり、上記は 2 つのセッション ファクトリの単なる定義であり、それぞれが独自のデータソースを使用しています。トランザクション マネージャーは、これらのセッション ファクトリの 1 つだけを使用しており、注釈駆動型の tx-management が構成されています。

トランザクションの動作をテストしようとしている単体テストは次のとおりです。


上記のテストの結果、非トランザクション データソースに新しい行が挿入されることを期待しています。これは、例外がスローされるため、トランザクション データソースの変更がロールバックされるためです。ただし、このテストに合格すると、両方のデータソースに行が挿入されます。

編集:私はもう少し移動しました。DaoHolder をインターフェイスにし、上記のロジックをインターフェイスを実装するクラス (DaoHolderImpl) に移動し、@Transactional でクラス (メソッドだけでなく) もマークしました。また、このクラスを Spring Bean として追加しました。これで、Spring が私のトランザクションを処理します。しかし今回は、例外をスローすると、新しい行はトランザクション データソースだけでなく、両方のデータソースからロールバックされます。これはまだ私が期待していたものではありません:/

誰かが私が間違っていることを見ていますか? 前もって感謝します、

ピーター

0 投票する
1 に答える
19463 参照

hibernate - Spring:複数のデータソースを処理するHibernateTransactionManager

次のコード(春3):

  • dao1は、datasource1に接続されたセッションファクトリを使用します
  • dao2は、datasource2に接続されたセッションファクトリを使用します
  • txManagerは、dao1と同じセッションファクトリを使用するHibernateTransactionManagerです。

上記のコードは、トランザクション方式で正しく機能します。特に、例外がスローされない場合、各dao操作は(2つの異なるデータソースに)コミットされます。例外がスローされると、各dao操作はロールバックされます。

私の質問は:なぜそれが機能するのですか?私が読んだところはどこでも、複数のデータソースを処理するときにJtaTransactionManagerを使用するように言われました。JTAは使いたくないです。HibernateTransactionManagerで実行したままにすると、どのような結果になる可能性がありますか?



興味のある方のためのいくつかの詳細:

各データソースは次のように定義されています。

各セッションファクトリは次のように定義されます。

トランザクションマネージャーは次のように定義されます。

各daoクラスはHibernateDaoSupportを拡張し、insertRowメソッドの内容はdao1の場合とほぼ同じです。

およびdao2の場合:

0 投票する
1 に答える
1429 参照

mysql - 春のテスト - ロールバックの問題

アプリケーションで Spring 統合テストを作成しました。問題は、1 つのテストが適切にロールバックされず、データベースにいくつかのものを残し、後続のテストが失敗することです。

永続化されたエンティティが単純なエンティティである場合、テストはうまく機能することに気付きました。エンティティが継承階層の一部であり、継承タイプが InheritanceType.JOINED の場合、テストは失敗します。InheritanceType.SINGLE_TABLE に変更すると、失敗しません。

以下はコードです: テストクラス:

春の構成:

エンティティ:

そして pom.xml ファイル:

0 投票する
1 に答える
969 参照

hibernate - 春。spring(hibernate) トランザクションによる DB トランザクション管理

それがどのように機能するかを修正できますか?トランザクション アノテーションでマークされたメソッド。インターセプトされたときに DB トランザクションが開かれ、Spring トランザクションの両方でコミットされます。また、そのようなメソッドが完了していない間、DB 内の関連するすべてのリソースがロックされたままになります。たとえば、トランザクション メソッドでは、DB からいくつかのエンティティを取得し、それらの一部を複数回更新または削除しました。これはすべてSpringトランザクションで発生しており、DBトランザクションは必要なロックを伴うトランザクションメソッドの最後でのみ発生します??? メソッドがデッドロックなどでハングした場合、ロックされたリソースは DB 内の他のリソースに対してロックされたままになりますか? 私が見るように、はい..

それらのすべてがロックを保持していました (23、21、20、5、6)。これはどのように起こりますか?私は長い手術をしていません。デッドロックのみ :D しかし、これは起こるべきではありません!! そのため、いくつかのトランザクション メソッドがハングしたが、リソースがロックされたままになっていることがわかりました。これにより、他のトランザクションまたは次のトランザクションが停止し、ロックされたリソースを待機し、すべてのシステムが動作を停止しました...

0 投票する
1 に答える
1695 参照

spring - @ManagedBeanと@Transactional-Springのバグ?回避策?

Webアプリに次のJSFバッキングBeanがありました

repository.saveメソッド呼び出しに到達すると、次のエラーが発生します

2つの質問があります

  1. これはこのようなバグが原因ですか?
  2. 2つの回避策があると思います-他に何かありますか?

2.1最初の回避策-を使用する

2.22番目の回避策

ヘルパークラスを作成し、代わりにそれに注釈を付けます。

2.3(考えられる3番目の回避策は、内部クラスのメソッドに@Transactionalアノテーションを付けることです。これは2.2と非常によく似ています)。

0 投票する
2 に答える
1470 参照

database - マルチスレッド環境でのトランザクションを使用したSpring + Hibernate

Hibernate を介して db (MySQL 5.1) の 1 つのテーブルからデータを取得し、コンテンツを表示する単純なアプリケーションがあります。使用される主なフレームワークは Spring 3.0 です。クエリは @Transactional(read-only) (+second cache level) で正しく実行されます。同じページに対して 20/30 リクエストを使用していくつかの同時テストを実行すると、問題が発生します。一部のページ要求は、200 ではなく 500 を返します。これは、@Transactional がマルチスレッド アクセスを管理していないためだと思います (間違っている場合は修正してください)。

コントローラーには、次のようなものがあります。

ログには、渡されたリストにデータがないため、「doSomething」が NullPointerException をスローしたことが示されています。

db への同時要求を管理する Spring+Hibernate を使用してマルチスレッド アクセス マネージャーを実装する方法はありますか?

0 投票する
0 に答える
132 参照

hibernate - weblogic 10 + Java 5 で休止状態用の分散型、厳密、トランザクション、読み取り/書き込み L2 キャッシュ プロバイダーはありますか?

weblogic 10 + Java 5 で休止状態用の分散型、厳密、トランザクション、読み取り/書き込み L2 キャッシュ プロバイダーはありますか?

Infinispan は魅力的に見えますが、Java 6 が必要です。Java 5 は手がかりです。

0 投票する
3 に答える
10365 参照

java - 宣言型トランザクション(@Transactional)は、Springの@Repositoryでは機​​能しません

Spring、JPA、組み込みH2データベースを使用して簡単なアプリケーションを作成しようとしています。最近、宣言型トランザクションでこの奇妙な問題に遭遇しました。@Repositoryアノテーションを使用してDAOを自動配線すると、コミットされません。具体的には、フラッシュで例外が発生します。

これが私の設定です:

persistence.xml

実在物

DAO

database.xml(ルートスプリングコンテキストから含まれる)

コントローラ

そして今、興味深い部分です。DAOから@Repositoryアノテーションを削除し、それをdatabase.xmlで明示的に指定すると、すべてが正常に機能します。

アップデート

別のサーブレット構成<tx:annotation-driven />のサーブレット構成に入れると問題が解決しますが、なぜですか?