[Это ответ на ответы. Пользовательский интерфейс не позволяет больше «комментариев» на ответы]
Какие запросы выполняются? Что на самом деле вызывает тупик?
В моей тестовой среде я выполнял очень простые запросы:
SQL1:
ОБНОВЛЕНИЕ принципала SET name = name + '.' ГДЕ Principal_id = 71
SQL2:
ОБНОВЛЕНИЕ принципала SET name = name + '.' ГДЕ Principal_id = 72
Затем выполнил их в порядке хиастика / крест-накрест, то есть без всяких коммитов.
connectionA
sql1
connectionB
sql2
sql1
sql2
Это мне кажется базовым примером тупика. Однако, если это «простой замок», а не тупик, пожалуйста, отвлеки меня от этого понятия.
На производстве наш «проблемный запрос» («prodbad») выглядел так:
ОБНОВЛЕНИЕ поста SET lock_flag =?
ГДЕ thread_id IN (ВЫБЕРИТЕ thread_id ОТ ПОСТА ГДЕ post_id =?)
Обратите внимание на несколько вещей:
1) Этот «запрос о проблеме» фактически работает. AFAIK это было
в этот раз тупик
2) Я подозреваю, что проблема заключается в блокировке страницы, то есть пессимистической блокировке из-за операций чтения в другом месте транзакции
3) Я не знаю, что sql эта транзакция выполнила до этого запроса.
4) Этот запрос является примером "я могу сделать это одним оператором sql"
обработка, которая кажется программисту умной, в конечном итоге вызывает гораздо больше операций ввода-вывода, чем выполнение двух запросов:
queryM: ВЫБЕРИТЕ thread_id ОТ ПОСТА ГДЕ post_id =?
queryN: ОБНОВЛЕНИЕ поста SET lock_flag =? ГДЕ thread_id = <>
*> (Мысль - ваши базы данных Dev являются копиями ваших производственных БД?
Если базы данных разработчиков на порядки меньше, чем Prod, ваши запросы могут быть такими же, но> то, что делает SQL «под капотом», будет сильно отличаться.) *
В этом случае БД prod и dev отличаются. «Prod сервер» имел тонны данных. «Dev db» имел мало данных. Запросы были очень разные. Все, что я хотел сделать, это воссоздать тупик.
*> Серверу не удалось возобновить транзакцию ... Почему ?. Вы должны обновить до JDB
C драйвер SQL v2.0, прежде чем что-либо еще. *
Спасибо. Мы планируем это изменение. Переключение драйверов сопряжено с небольшим риском, поэтому нам нужно выполнить какой-нибудь тест.
Напомним:
У меня была «яркая идея», чтобы вызвать простой тупик и посмотреть, было ли мое соединение «сломано / замкнуто / разорвано / и т.д.» Однако тупик вел себя не так, как на производстве.