Минимизация тупика таблицы в моем сценарии с Oracle и InnoDB

StackOverflow https://stackoverflow.com/questions/3402138

Вопрос

У меня есть 35 функций, которые обновляют от 1 до 3 таблиц, в транзакции. Однако они не просто выполняют обновления, но они также делают запросы.

  • Таблица 1 подряд обновляется только действиями, а некоторые запросы.
  • Таблица 2 Означает ли запросы и уровень строки на существующие строки, а иногда удаляют и добавляют строки. Таблица 2 может иметь запросы в транзакции до и после удаления строки и или вставки и или обновлениях.
  • Таблица 3 делает обновления строки на основе результатов действий таблицы 2 выше.

Мое первое действие будет, чтобы убедиться, что обновления в таблице 3 все сделаны в конце.

Таблица 1 не зависит от других 2 таблиц, и, вероятно, может быть первым или последним. Таким образом, таблица 2 должна прийти до изменения таблицы 3.

Моя первая озабоченность в том, что с таблицей 2 действия я делаю запросы, затем обновляю, затем больше запросов, потом еще больше обновлений. Должен ли я решить мой код не делать этого.

Моя вторая озабоченность заключается в том, что таблица 3 - это таблица, которую с нитями сервлета должно быть быстро. Таблица 3 используется для просто запросов самостоятельно. Но кажется, что замки на уровне строки остановят эти запросы.

Если мне придется, я могу поставить код набора набора, описанный выше в одном процессе кластера, из одного потока. Скорость обновлений не имеет значения. Точно то, что запросы против таблицы 3 быстро. И что нет никакого тупика.

Я не знаю различия между Oracle и InnoDB, поэтому у меня там есть вопросы. (Я планирую обновить до Oracle позже.)

По сути, я ищу указателей о том, для чего осмотреть. Конечно, я мог бы заставить полный столик замок на таблице 2, а затем в таблице 3 в начале каждой функции обновления, но потом пострадал мою нить запроса сервлета Table3. Так что это не похоже на решение.

Кроме того, я беспокоюсь только по сравнению с самой таблицей 2, что некоторые функции делают запросы, обновления на основе запроса, новые запросы на основе обновления, а затем больше обновлений, включая результаты течения через обновления в таблицу 3. Это кажется Действительно противно.

Рекомендации? Энди

Там могут быть одновременные обновления в одних и тех же рядах 2 столов, и я позаботился о том, чтобы ударить таблицы с обновлениями в том же порядке. Один из таблиц имеет 2 индекса, и кажется, что замок для обновления индекса необходим столик? Некоторые из функций Запрос в таблице 1, Таблица обновления 1, затем необязательно Запрос таблицы 2, затем обновляйте таблицу 2, в повторении цикла. Эта таблица содержит все родительские дочерние отношения в дереве всего моего содержания, поэтому он обновляется громкостью по всем пользователям.

Это было полезно?

Решение

Во-первых, запросы в Oracle (и я полагаю, InnoDB) не беру замок, если вы не используете для обновления.

Во-вторых, я не получаю никакого представления о вашей шкале приложений. Сколько одновременных транзакций вы ожидаете иметь? Вы ожидаете, что они будут обновлять одни и те же строки?

Вид приложения, которое может страдать от тупиков, является бронирование или система билетов (например, люди, пытающиеся забронировать те же места в театре), особенно в ситуациях с высокой связью (новое шоу становится доступным для бронирования).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top