2

私のアプリケーションでは、2 つのスレッドが次のようにコード内の同じエンティティを更新しようとしています。

public static <T> T updateEntity(T entity, long id) {
    long start = System.currentTimeMillis();
    EntityManager em = null;
    EntityTransaction tx = null;
    try {
        em = GenericPersistenceManager.emf.createEntityManager();
        tx = em.getTransaction();
        tx.begin();
        entity = em.merge(entity);
        tx.commit();
        LoggerMultiplexer.logDBAccess(start, System.currentTimeMillis(),
            String.format(OPERATION_UPDATE_ENTITY, entity.getClass().getName(), id));
        return entity;

    }
    ...

コミット行で重複キー エラーが発生することがあります。これは、スレッドが同時にエンティティを更新しようとしたときに発生すると思います。出来ますか?上記の関数に a を追加するsynchronizedと、重複キーの例外が発生しないため、そう思います。では、そのような同時実行の問題を考慮する必要がありますか? もしそうなら、複数のスレッドが同じオブジェクトを更新しようとしている場合、適切な方法は何でしょうか。

4

1 に答える 1

1

シングルノードアプリケーションでは、DBからオブジェクトを取得するときに、 ( )lock内のオブジェクトを試すことができます。SessionPessimistic versioning

ロックの詳細。そして、休止状態の並行性に関するちょっとしたアドバイス。

しかし、多分あなたはあなたを再考する必要がありますunits of worklockingまたはブロックを追加synchronized すると、アプリケーションで高い競合が発生します。トランザクションの基本を少し開発するときは、覚えておくのが最善です。Detached Objectオブジェクトまたはパターンの寿命を短くします。を使用し(たとえば、フィールドをOptimistic versioning追加することにより)、同時変更でエラーを処理します。version

于 2013-03-04T22:16:02.230 に答える