2013-06-18 77 views
0

我有两个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> 
+0

什么是你的Isolation_level? – Cygnusx1

+0

这里是一个很好的链接:http://www.oratechinfo.co.uk/deadlocks.html#unindex_fk – Cygnusx1

+0

我使用默认的Oracle隔离杠杆 - 读提交。 – user2382219

回答

0

好吧,首先,你应该能够找到一个跟踪日志在Oracle这个僵局。你可能会看到究竟是什么导致了死锁。

看到this thread

死锁和会发生什么设置,您尝试在事务级别!您可能必须检查批处理的逻辑,并行运行它们可能会导致更多的武器,然后再处理。

在你的情况下,作业A和作业B可能会争取在oracle数据库中锁定相同的记录。

祝你好运

相关问题