0

同じライブラリを使用してデータベースを操作する2つのアプリケーションがあります。最初のアプリケーションはデスクトップで、2番目のアプリケーションはWebです。したがって、両方が私のデータベース(PostgreSql)で同時に同じレコードを変更できます。ライブラリは次のコードを使用します。

    //it doesnt use em.getTransaction()
em.merge(userAcc);//change useraccount

このコードはデッドロックを引き起こす可能性がありますか?マージのデフォルトの動作は何ですか?マージは内部でトランザクションを使用しますか?実際には、2つのマージ操作の順序は重要ではありません。

4

1 に答える 1

1

JavaPersistencewikibookからの関連する引用。

技術的には、JPAでは、EntityManagerは作成された時点からトランザクション内にあります。したがって、beginはやや冗長です。beginが呼び出されるまで、persist、merge、removeなどの特定の操作を呼び出すことはできません。クエリは引き続き実行でき、クエリされたオブジェクトは変更できますが、これはJPA仕様のこれらの変更に何が起こるかは多少指定されていませんが、通常はコミットされますが、変更を加える前にbeginを呼び出すことをお勧めします。オブジェクト。

したがって、この場合の動作はmerge()永続性プロバイダーに依存するようです。

とにかく、エンティティは暗黙のトランザクションで更新されると思いますが、これによってデッドロックが発生する可能性はないと思います。最悪のシナリオは、2つのアプリケーションから同じエンティティへの同時更新が、それを知らずに相互にオーバーライドすることです。楽観的ロックを使用することで、これを防ぐことができます。

于 2013-02-23T18:05:03.173 に答える