У нас есть транзакция, которая модифицирует запись. Транзакция должна вызывать веб-службу, откатывая транзакцию, если служба завершается с ошибкой (поэтому она не может передать ее в руки). Поскольку запись изменена, клиентское приложение имеет блокировку. Тем не менее, веб-служба должна получить эту запись, чтобы получить информацию от нее как часть ее обработки. Бам, тупик.DB2 Чтение выполнено без блокировки?
Мы используем websphere, которая по причинам, которые пугают мой разум, по умолчанию имеет повторяемый уровень изоляции чтения. Мы сбили его до read_committed, думая, что это будет извлекать строку без поиска блокировки. В нашей среде разработчиков, похоже, это сработало, но при постановке мы получаем взаимоблокировки.
Я не спрашиваю, почему это ведет себя по-другому, мы, вероятно, где-то совершили ошибку. Я также не спрашиваю о специфике примера веб-службы выше, потому что, очевидно, это то же самое может произойти в другом месте.
Но, основываясь на чтении документов, кажется, что read_committed DOES получает общую блокировку во время чтения, и в результате будет ждать эксклюзивной блокировки, удерживаемой другой транзакцией (в данном случае клиентским приложением). Но я не хочу идти на уровень read_uncommitted изоляции, потому что я не хочу, чтобы грязные чтения. Существует ли менее экстремальное решение? Мне нужна промежуточная площадка, где я могу выполнять чтение без ожидания блокировки и извлекать только зафиксированные данные.
Есть ли такое решение? Не слишком тупик, не слишком грязный-читал-у? Если не на уровне siolation, может быть, какой-то модификатор я могу применить к моему SQL? Что-нибудь?
Точка блокировки, чтобы предотвратить что-то другое от изменения строки, не так ли? Не так, чтобы вы могли обновить его позже?Или можно ли разрешить другим процессам обновлять строку, ваш процесс просто должен обработать это потом? Можете ли вы назвать веб-сервис «локально»? Я знаю, что db2 поддерживает совместное использование блокировок для одного и того же сеанса, но это, вероятно, не происходит, если вы сначала отправляете off-box. Каков уровень блокировки другого веб-сервиса? –
@ Clockwork-Muse - Нет, клиент действительно блокируется при подготовке к обновлению. Webservice реализует специальную схему уведомлений рабочего процесса, которая должна запрашивать соответствующую запись для создания уведомления (хотя она считывает разные поля, чем обновляется, что ничего не меняет). Веб-сервис и клиент в настоящее время работают с прочитанными. Я боюсь, что самое простое исправление (поддерживаемое нашим руководством по DB) заключается в том, чтобы перейти на чтение uncommitted для службы, но я пытаюсь найти альтернативный b/c, я ненавижу этот ответ. – user1187719
Вам все равно, если кто-нибудь еще обновляет строку тем временем? Значения, которые вы могли бы обновить после разницы, независимо от того, какие другие манипуляции произошли? Или просто не волнует, если кто-то еще обновил записи за это время и перезаписал изменения? Вы уверены, что не можете запустить это в том же поле, что и сервис, возможно, чтобы он был частью одного сеанса? –