我有两个Spring批处理作业:第一个作业A从CRM系统(通过Web服务)读取数据并将其写入Oracle数据库表;第二个(作业B) - vise verse - 从相同的Oracle数据库表中读取数据并将其发送到CRM(通过Web服务)。我使用HibernateTemplate来完成数据库操作。保存和更新Oracle数据库的方法用@Transactional(propagation = Propagation.REQUIRES_NEW)标记。 这些批处理作业同时工作。 在某些时候,两个作业互相阻塞: - 作业A从Oracle数据库块中读取记录时,必须读取数据并将数据发送到CRM的作业冻结,我可以做的唯一操作是手动停止作业。 -job乙冻结过,后来抛出异常:Spring批处理作业同时访问数据库锁
Caused by: org.hibernate.exception.LockAcquisitionException: could not execute update query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:87)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:84)
at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:396)
at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:259)
at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1141)
at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:94)
at org.springframework.orm.hibernate3.HibernateTemplate$39.doInHibernate(HibernateTemplate.java:1150)
at org.springframework.orm.hibernate3.HibernateTemplate$39.doInHibernate(HibernateTemplate.java:1)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
... 60 more
造成的:值java.sql.SQLException:ORA-00060:等待资源死锁检测
我不熟悉与Hibernate尤其是当它与Spring一起工作。我的理解是,Hibernate管理交易,但显然我错了。 你能请教我,哪里可以成为这些锁的原因。 我的休眠设置:
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">false</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.default_batch_fetch_size">0</prop>
<prop key="hibernate.cache.use_structured_entries">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.use_sql_comments">true</prop>
<prop key="hibernate.jdbc.batch_size">0</prop>
<prop key="hibernate.jdbc.use_streams_for_binary">true</prop>
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF8</prop>
<prop key="hibernate.mapping.precedence">class</prop>
<prop key="hibernate.transaction.flush_before_completion">true</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
</props>
</property>
什么是你的Isolation_level? – Cygnusx1
这里是一个很好的链接:http://www.oratechinfo.co.uk/deadlocks.html#unindex_fk – Cygnusx1
我使用默认的Oracle隔离杠杆 - 读提交。 – user2382219