Решение проблемы MySQL Deadlock - PullRequest
1 голос
/ 22 марта 2012

Сервис : у нас есть сервис, который получает 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

Мы пытались решить эту проблему, но не смогли выяснить первопричину. Любое понимание вероятной проблемы было бы полезно.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...