Spring @Transactional提交失败; Deby + Eclipselink [英] Spring @Transactional commit failures ; Deby + Eclipselink
问题描述
以下是spring配置
The following is the spring config
日期来源
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="${rwos.dataSource.driverClassName}" />
<property name="url" value="${rwos.dataSource.url}" />
<property name="username" value="${rwos.dataSource.user}" />
<property name="password" value="${rwos.dataSource.password}" />
</bean>
实体管理器配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="persistenceUnitManager" class="org.springframework.data.jpa.support.MergingPersistenceUnitManager">
<property name="defaultDataSource" ref="dataSource"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="persistenceUnitManager"/>
<property name="persistenceUnitName" value="com.retailwave.rwos_rwos-data-pojo_jar_4.0.0PU"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" lazy-init="true">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
</beans>
以下是用于保留实体的代码段
The following is the code snippet used to persist entity
@Singleton
@Component
public class RWTransactionDao {
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
@Transactional
public void createOrderTxns(RWRetailTransaction peTxn, RWRetailTransaction fcTxn) {
create(peTxn);
create(fcTxn);
log.debug("Committed Transaction : {} ", peTxn.displayString());
log.debug("Committed Transaction : {} ", fcTxn.displayString());
}
@Transactional
public void create(T entity) {
getEntityManager().persist(entity);
}
}
班级:
@Component
@Path("/")
public class RWTransactionREST {
@Inject
private RWTransactionDao rWTransactionDao;
@POST
@Produces(MediaType.APPLICATION_JSON)
@Path("txns/sales")
public RWResponse createPurchaseTransaction(RWRetailTransaction peTxn, RWRetailTransaction fcTxn) {
rWTransactionDao.createOrderTxns(peTxn, fcTxn);
builder.status(RWStatus.OK);
RWResponse response = builder.build();
log.info("Returning.. {}", response);
return response;
}
}
日志消息:
2017-06-14 10:49:51,453 DEBUG [qtp592179046-13] - Committed Transaction : RWRetailTransaction[609, CU_ORD, RTCO-609-17-11193, 2017-06-14 10:49:51.431]
2017-06-14 10:49:51,453 DEBUG [qtp592179046-13] - Committed Transaction : RWRetailTransaction[509, CU_ORD, RTCO-509-17-11193, 2017-06-14 10:49:51.444]
2017-06-14 10:49:51,463 INFO [qtp592179046-13] RWTransactionREST - Returning.. Response[1000:Order has been created successfully, Transaction Id : RTCO-609-17-11193]
一段时间后,在其他一些REST实现方法中的同一RWTransactionDao中发生了以下错误
After some time the following error occurred in the same RWTransactionDao in some other REST imple methods
2017-06-14 10:51:24,199 ERROR [qtp592179046-16] com.retailwave.rwos.compartment.rest.exception.RWCompartmentRestExceptionMapper - Exception caught at Mapper : Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.4.v20160829-44060b6): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLTransactionRollbackException: A lock could not be obtained within the time requested
由于此错误,先前的提交已回滚,但事实并非如此.
Due to this error previous commit got rolled back but it not supposed to be.
不确定导致此回滚的原因.
Not sure what causes for this rollback.
推荐答案
问题是由于PersistenceContextType.EXTENDED
引起的.我做了两次更改,问题得到解决.
The problem was due to PersistenceContextType.EXTENDED
. I did two changes and problem got resolved.
-
PersistenceContextType.EXTENDED
更改为PersistenceContextType.TRANSACTION
-
@Singleton
更改为@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
PersistenceContextType.EXTENDED
changed toPersistenceContextType.TRANSACTION
@Singleton
changed to@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component
public class RWTransactionDao {
@PersistenceContext(type = PersistenceContextType.TRANSACTION)
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
@Transactional
public void createOrderTxns(RWRetailTransaction peTxn, RWRetailTransaction fcTxn) {
create(peTxn);
create(fcTxn);
log.debug("Committed Transaction : {} ", peTxn.displayString());
log.debug("Committed Transaction : {} ", fcTxn.displayString());
}
@Transactional
public void create(T entity) {
getEntityManager().persist(entity);
}
这篇关于Spring @Transactional提交失败; Deby + Eclipselink的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!