Как избежать превышения ожидания ожидания ожидания ожидания ожидания.?
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.
Кто-нибудь знает, как его решить..??
Ответы
Ответ 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 лучшей практики. Однако при этом эти методы будут работать безупречно большую часть времени, но не все время.
Итак, как тестировать и разрешать блокировку потоков?
Проверьте, что:
Наконец, используйте @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.Если вы используете множественное соединение, его время выполнения Какое соединение использовать в этом случае, оно показывает, что Тайм-аут ожидания блокировки превысил Исключение.