解决MySQL死锁问题

时间:2012-03-22 06:21:15

标签: java mysql hibernate

服务:我们有一个接收Request的服务,它只是将其保存在数据库中。以下是hbm文件。

<hibernate-mapping package="com.project.dao">
        <class name="Request" table="requests">
                <id name="requestId" type="long" column="req_id">
                        <generator class="native" />
                </id>
        <class>
        <discriminator column="req_type" type="string" force="true"/>
        <property name="status" type="string" column="status"/>
        <property name="processId" type="string" column="process_id"/>
        <subclass name="RequestType1" discriminator-value="Type1">
          ..
        </subclass>     
        <subclass name="RequestType2" discriminator-value="Type2">
          ..
        </subclass>     
</hibernate-mapping>

获取会话并保存Request的代码如下。

try{
  Session session = HibernateUtil.getSessionFactory().getCurrentSession();
  Transaction tx = session.beginTransaction();
  requestDAO.save(request);
  tx.commit();
}catch(Exception e){
  log.error(e);
}

客户端:客户端有两台主机读取这些已接收和未处理的请求。每个客户端(Host1,Host2)都会关注。

将未处理请求的process_id更新为其主机名。

update requests set process_id='" + hostName + "' where status='Received' and process_id is null order by req_id asc limit 100"

检索上面更新的请求并处理它们。

select * from requests where process_id='"+ hostName + "' where status='Received';

现在问题是,一段时间以来,这些客户端工作正常。但过了一段时间,他们开始抛出异常。

org.hibernate.exception.GenericJDBCException: could not execute native bulk manipulation query at  org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)

Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

如果我们重新启动它们,客户端将再次开始正常工作。

在服务方面,我们有时会看到以下例外情况。

org.hibernate.AssertionFailure: null id don't flush the Session after an exception occurs

我们一直在尝试解决此问题,但无法找出根本原因。任何对可能问题的见解都会有所帮助。

由于

0 个答案:

没有答案
相关问题