Подтвердить что ты не робот

Как избежать превышения ожидания ожидания ожидания ожидания ожидания.?

    java.sql.SQLException: Lock wait timeout exceeded; try restarting tra
nsaction at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.ja
va:2077)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:
2228)
        at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:
208)
        at org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
        at org.hibernate.loader.Loader.doQuery(Loader.java:697)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Lo
ader.java:259)
        at org.hibernate.loader.Loader.loadEntity(Loader.java:1885)
        ... 131 more

Я получаю повторное превышение исключения блокировки при обновлении записей.

Я использую конфигурацию спящего режима Java Struts 2.1. Используемый DB - MYSQL.

Кто-нибудь знает, как его решить..??

4b9b3361

Ответ 1

Вот несколько советов:

  • Тайм-аут блокировки ожидания происходит, как правило, когда транзакция ожидает строки (строк) данных для обновления, которая уже заблокирована какой-либо другой транзакцией.
  • В большинстве случаев проблема кроется в стороне базы данных. Возможными причинами могут быть неправильная конструкция таблицы, большой объем данных, ограничения и т.д.
  • Посмотрите подробный ответ.

Ответ 2

Убедитесь, что в таблицах базы данных используется механизм хранения InnoDB и уровень изоляции транзакций READ-COMMITTED.

Вы можете проверить его на SELECT @@GLOBAL.tx_isolation, @@tx_isolation; в консоли mysql.

Если он не установлен для READ-COMMITTED, вы должны установить его. Перед установкой убедитесь, что у вас есть привилегии SUPER в mysql.

Вы можете обратиться за помощью из http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html.

Установив это, я думаю, ваша проблема будет решена.

Спасибо.

Ответ 3

Это может быть вызвано неправильным использованием следующей аннотации, например, в этой статье StackOverflow:

@Transactional(propagation = Propagation.REQUIRES_NEW)

Ответ 4

(С уважением игнорируя конкретные ответы БД)

При использовании формальной схемы CRUD со всем трафиком DB, направляемым через класс Singleton, вы все равно можете столкнуться с блокировкой потоков. Это часто происходит из-за недосмотра между собой, колледжем и командой Hibernate. Поэтому быстрее просмотреть свой собственный код для ошибок, уделяя особое внимание правилам спящего режима.

Обычно интерфейс CRUD имеет общедоступные методы "Создать", "Читать", "Обновить" и "Удалить", которые используют общие частные методы. Это делается для DRY лучшей практики. Однако при этом эти методы будут работать безупречно большую часть времени, но не все время.

Итак, как тестировать и разрешать блокировку потоков?

Проверьте, что:

  • session.save(myObj) действия сначала проверяют уникальность ПК
  • Все запросы uniqueResult() действительно возвращают 1 результат, And;

    (Важно!) Фокус Тестирование:

    • Введите дубликаты ПК
    • Обновить/прочитать/удалить несуществующие записи/записи/строки

Наконец, используйте @AfterSuite (TestNG), чтобы удалить все записи в таблице. Любая недостаточная реализация приведет к еще одной блокировке потока для вышеупомянутой операции... иначе вы будете золотыми.

Ответ 5

Обычно проблема возникает, когда запрос занимает слишком много времени. Из-за сервер слишком занят.

Решение:

  • Убедитесь, что в таблицах базы данных используется механизм хранения InnoDB и READ-COMMITTED уровень изоляции транзакций.
  • Если приведенная выше конфигурация верна, попробуйте увеличьте базу данных сервера innodb_lock_wait_timeout переменной до 500.
  • Пул соединений можно также увеличить в файле persistence.xml
<property name="hibernate.c3p0.max_size">50</property>

Ответ 6

Проверьте, оптимизировано ли предложение where, например, с использованием первичного ключа и/или индексов

Ответ 7

Если все вышеописанное не работает, проверьте сообщение об ошибке из журнала mysql. Если он упоминает о размере файла журнала, вам необходимо увеличить его в конфигурации и перезапустить сервер mysql.

Ответ 8

1. Проверьте, что вы используете несколько подключений к базе данных. 2.Если вы используете множественное соединение, его время выполнения Какое соединение использовать в этом случае, оно показывает, что Тайм-аут ожидания блокировки превысил Исключение.