問題タブ [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.
spring - Spring @Transactional が必要なトランザクションを作成しない
わかりました、それで私はついに仲間の圧力に屈して、Web アプリで Spring を使い始めました :-)...
そのため、トランザクション処理を機能させようとしていますが、それを取得できないようです。
私のSpring構成は次のようになります:
persistence.xml:
ドメイン オブジェクトを保存する DAO メソッドは次のようになります。
そこで、テスト ケースで次のコードを使用して、グループ オブジェクトのコピーを保存しようとしました。
これは、次の例外を除いて爆撃します。
さらに、Spring の初回起動時に次の警告が表示されます。これらはentityManagerFactoryとtransactionManagerを参照しているので、おそらく問題に関係していますが、私はそれらを十分に解読して何を知ることができませんでした:
誰かが私が見逃しているものを知っていますか? 私は完全に困惑しています...
ありがとう
ruby-on-rails - Rails test db はレコードの変更を保持しません
ここ数週間、問題を解決しようとしています。Rails アプリの rspec テストを実行していますが、理解できないエラーが 1 つある以外は問題なく動作しています。
- InnoDB エンジンで MySQL を使用しています。
config.use_transactional_fixtures = true
spec_helper.rbに設定しました- コマンドを使用して、テスト フィクスチャを手動でロードします
rake spec:db:fixtures:load
。 - rspec テストは BackgrounDRb ワーカー向けに作成されており、(state_machine gem を介して) レコードの状態を更新できることをテストしています。
これが私の問題です:
というモデルがありListings
ます。rspec テストは、update_sold_items
というファイル内のメソッドを呼び出しますlisting_worker.rb
。このメソッドはlisting.sell
特定のレコードを呼び出し、リスト レコードの「状態」列を「販売済み」に設定します。これまでのところ、これはすべて正常に機能していますが、update_sold_items
メソッドが終了すると、rspec テストはここで失敗します。
状態の変化が持続しない理由を突き止めようとしていますが、ほとんど失われています。update_sold_items
テスト中にメソッドに配置したデバッグ コードの結果を次に示します。
reload
なぜそれが完全にうまく保存されるのか理解できませんが、呼び出すたびに元のレコードに戻りますListing.find
.
これを読んでくれてありがとう。十分な情報を提供していない場合は、質問してください。
助けてくれてありがとう、ネイサン・B
PS他のクラスの新しいレコードを作成し、それらのレコードをテストすることに問題はありません。データベースに既に存在するレコードを更新している場合にのみ問題になるようです。
hibernate - groovyでTransactionalアノテーションを使用する際の問題
誰かがGroovyクラスで開始されていないSpringトランザクション(クラスレベル、プロキシ、アノテーション駆動型)の経験がありますか?スタックトレースにトランザクションを開始するための呼び出しが含まれていないことに気付いた、原因不明のLazyInitialization例外に苦労してきました。クレイジーに聞こえますが、GroovyがTransactionalアノテーションを採用しているかどうか疑問に思う必要があります。
ruby-on-rails - Rails - before_create から false を返すと、他のモデルへの変更が防止されます
before_create
人々がコメントを投稿しすぎていないかどうかをチェックするフィルターがあります。
もしそうなら、私は彼らのアカウントにフラグを立てたいです。
before フィルターは false を返し、コメントの作成を停止します。問題は、これがユーザー モデルに加えた変更を元に戻す ROLLBACK をトリガーすることです。
これを達成するための正しいパターンは何ですか? 具体的には、オブジェクトが作成されるたびにチェックを実行し、チェックが失敗した場合に別のモデルを編集できるようにすることです。
spring - junitテストケーストランザクションがコミットされない-エラーなし
SpringコアとJPAをDB2で使用するアプリケーションにJUnit4を実装しました。あるデータベースからデータを取得して別のデータベースにマージする完全な機能をテストする必要があります。
1番目のデータベースからデータを取得するためのテストケースが作成され、エラーなしで完全に実行されていますが、レコードは2番目のデータベースに保存されていません。
実装
TestCaseクラスには、必要に応じてトランザクションでテストケースを実行するために、次のアノテーションが含まれています。
アプリケーションには、doSynch()メソッドを使用してこの操作を実行するためのマネージャークラスがあります。そのメソッドから、crudHelperクラスのtxStore()メソッドが呼び出されて初期化され、doStore()メソッド(同じクラス内)が呼び出されてエンティティがデータベースにマージされます。
以下は、このテストケースロジック全体のトランザクション宣言です。
doSynch()は、その時点ではトランザクションを必要としないため、NEVERとしてマークされ、CRUDHelperなどのさらなるレベルでは、トランザクションを確実に使用可能にするためにトランザクションをREQUIREDとしてマークできます。
問題
ここで、マネージャーのdoSynch()メソッドを呼び出して機能をテストするテストケースを実行すると、レコードがマージされず、エラーがスローされないことを除いて、完全なフローが完全に機能します。
JSPから呼び出された場合のManagerメソッドはうまく機能します。また、テストケースから直接txStore()を呼び出してテストしましたが、これも正常に機能します。
トランザクション管理が適切でないかどうか、またはこの問題の回避策がさらに役立つかどうかをお知らせください。また、問題や環境が明確でない場合は、plsが私を更新します。前もって感謝します。!!
java - SpringAnnotation@Transactionalを拡張する方法
Webアプリで3つの異なるトランザクションマネージャーを使用する必要があります。そこで、 Springリファレンス(セクション10.5.6.3カスタムショートカットアノテーション)に従って独自のアノテーションを作成しました。
1つのアノテーション(1つの特定のtransactionmanagerを使用するため)は次のようになります。
カスタマイズされた@CustomerTXアノテーションでサービスレイヤーにアノテーションを付けると、すべてが正常に機能します。ただし、readonly = true、rollbackFor =など、アノテーションにさらに多くのオプションを提供する必要があります。アノテーションを「拡張」することはできないので(私は本当にSpringから@Transactionalアノテーションを拡張する必要があります)、これの正しい実装は何ですか?
hibernate - postgresqlのトランザクションがコミットされておらず、マップされたオブジェクトがautoCommit=falseで永続化されていません
実行中のトランザクションでpersistを呼び出すと、マップされたオブジェクトがDB(Postgresql 8.4)に永続化されません。SpringTransactionManagementを使用しています
org.springframework.jdbc.datasource.DataSourceTransactionManager
だからすべてがうまくいくはずです。DataSourceのautocommit-modeを「false」に設定しました。モードを「true」に設定すると、コミットが実行されます(そして、オブジェクトは永続化されます)が、それはより大きな問題につながります(たとえば、dbからblobをフェッチする)。したがって、autocommit-modeを「false」に設定する必要があります。これは、誰もが私に言った優先モードでもあります...
これは私の永続性の構成です(コードを必要なものに減らしました):
また、3つの異なるトランザクションマネージャー(もちろん3つの異なるデータソース)を使用していることにも言及する必要があります...
上記の修飾子属性に反映される私自身のトランザクションアノテーション:
オブジェクトを永続化する「必要がある」注釈付きサービスクラス...
これは、db呼び出しを呼び出すサービスメソッドを呼び出すときのログです。
ご覧のとおり、トランザクションは(ログに従って)コミットされていますが、オブジェクトはdbに永続化されていません(挿入と更新は実行されていますが)。
データソース構成でコミットモードをに設定する場合
プロパティname="defaultAutoCommit" value = "true"
すべてが正常に動作します!
何がこの奇妙な問題を引き起こしているのか本当にわかりません...誰かが私にヒントをくれたら嬉しいです。
spring - Spring 2.5 で外部トランザクションから内部トランザクション設定を制御する
Spring 2.5 トランザクション管理を使用しており、次のように設定しています。
ビーン1
Bean2
トランザクション全体がロールバックされるため、障害が Bean1 から DB に永続化されることはありません。
ランタイム例外を適切に処理するロジックがない多くの場所で使用されているため、Bean2に noRollbackForを追加したくありません。
Bean2.execute() が Bean1 から呼び出された場合にのみトランザクションがロールバックされるのを回避する方法はありますか?
それ以外の場合、私の最善の選択肢は、新しいトランザクション内で失敗を永続化することだと思いますか? 他にできることはありますか?
java - プロセスのトランザクション性をテストすることは可能ですか?
各作業単位が独自のトランザクションで実行されているのか、単一のグローバルトランザクションの一部として実行されているのかを確認できるようにしたいと思います。
次の形式のメソッド(springとhibernateを使用して定義)があります。
これは、ユーザーがログインしたときのWebサイトと、毎日実行されるバッチジョブの2つの場所から呼び出されます。Webサーバーのコンテキストでは、Webサーバーによって作成されたトランザクションで実行されます。バッチジョブの場合、ユーザーごとに1つのトランザクションが必要です。これにより、このメソッド中に何かが失敗した場合、トランザクションがロールバックされます。したがって、2つの方法があります。
updateUserCreateNewTransaction()はバッチジョブから呼び出され、updateUserWithExistingTransaction()はWebサーバーコンテキストから呼び出されます。
これは機能します。ただし、(バッチの)この動作を変更しないことが非常に重要であるため、この動作をテストするテストを作成したいと思います。可能であれば、コードを変更せずにこれを実行したいと思います。
したがって、私が利用できるオプションのいくつかは次のとおりです。
バッチジョブの実行中にデータベースで開かれたトランザクションをカウントします。
updateSomethingElse()メソッドで、少なくとも1つのユーザー更新が失敗するようにデータを微妙に変更し、そのユーザーのupdateSomething()が実行されていないことを確認します。
コードレビュー。
1はデータベースに非常に依存する方法ですが、休止状態がトランザクションを作成しないことをどのように保証しますか?2の方が良いようですが、設定は非常に複雑です。3は、リリースごとに1つ実行する必要があるため、実際には実用的ではありません。
それで、誰かが私がこのコードを、できればシステムテストまたは統合テストを通してテストすることを可能にする方法を持っていますか?
java - 春と@transactional、これは正常ですか?
私はこの簡単な例を書きました:
そして、これは私の試みです:
今、奇妙な振る舞い(私は春に非常に新しいです):
@Transactional
メソッド「useController()」を宣言すると、出力は次のようになります。true true@Transactional
からTestService
に移動しTestControllerImp
、「findAll()」をで宣言すると@Transactional
、出力はfalsefalseになります。
なぜ私はこの振る舞いをするのですか?デフォルトでクラスがシングルトーンであることは知っています@Autowired
が、最初のケースでフラグがまだ真のままであるのはなぜですか?
皆さんありがとう。