複数の物理インスタンスに負荷分散された環境に配備されたWebアプリケーションがあります。すべてのインスタンスが同じデータベースに対話します。データベースロックJPA2 Hibernate複数VM間でのスプリング
私はguiからトリガーできるトランザクションがあります。この操作が同時に要求された場合は、VM全体または同じVM上で確実に実行されます。 1つのトランザクションだけが成功するか、トランザクションがシリアル化されること。
私は、Hibernate 3.6、Spring 3.1、およびJPA2(Hibernateを含むjar)を使用しています。私は解決策を使用しようとしている
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE, rollbackFor = LockTimeoutException.class)
public boolean MY_OP(Boolean Flag) throws RuntimeException
私の構成は以下のとおりです:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="DB_UNIT_NAME" />
<property name="dataSource" ref="dataSource" />
<property name="jpaDialect">
<bean class="com.server.persistence.HibernateExtendedJpaDialect"/>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="${dbConfig.dialect}" />
</bean>
</property>
</bean>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
が、これは負荷分散環境における複数のJVMの間で分離を実現しませんか?私は人々が前にこの問題を解決していなければならないと確信しているので、どんなアイデアも役に立つでしょう。
EDIT
これは、単一のJVM/ASに分離を達成します。私はJBoss AS 4.3.2を使用しています(はい、私は古いことを知っています)。
MY-TRANSACTIONのインスタンスが同じJVM/ASで起動されているか、複数のインスタンスが同時に起動されているかを問わず、そのうちの1つだけを実行する必要があります。私は分離レベルで作業するのはかなり新しいので、これが正しいレベルかどうかは分かりません。しかし、私は掲示された質問の解決策は、私が言うことができるからこれを達成すると思われる、私はこれがこの問題にアプローチする正しい方法だったと思っていた。 –
はい、そうすべきですが、並行性を扱うときにはおそらく多くのトランザクション例外が発生することに注意してください。その分離レベルで負荷テストを行い、すべてが正常であることを確認する –