У меня есть проблема, я не уверен, как лучше всего решить.
У меня есть приложение, которое обновляет базу данных в ответ на специальные запросы. Один запрос в особенности довольно распространен. Запрос является обновлением, которое отдельно довольно просто, но имеет некоторые сложные предварительные условия.
Этот последний шаг является проблемой, эта команда зависит от состояния базы данных, которая, возможно, изменилась, так как бизнес-логика работала. Блокировка вниз чтения данных в этой операции через несколько распространений в прямом и обратном направлениях к базе данных не походит на хорошую идею также. Существует ли 'лучшая практика' способ выполнить что-то вроде этого?Спасибо!
Проще говоря, когда вы выполняете команду update, вы обеспокоены тем, что база данных могла измениться?
Тогда вызывайте хранимые процедуры, которые написаны защитно и будут обновлять данные только в том случае, если они находятся в приемлемом состоянии на момент вызова (путем проверки ссылок на внешние ключи, целостности данных и т.д.).
Дайте мне знать, если я могу помочь в моделировании некоторых аспектов этого.
Вы можете сохранить исходное состояние измененных бизнес-объектов и сравнить исходные объекты с их аналогами в базе данных, чтобы проверить, не было ли что-либо изменено.
Если были внесены изменения, у вас есть выбор: объединить объекты на основе исходных, измененных и сохраненных (базы данных) объектов, либо отменить обновление и сообщить клиенту, что обновление не удалось.
Это довольно сложно, потому что в вопросе не так много деталей, поэтому я просто приведу простой пример, который вы можете применить в своей ситуации.
Загрузить все данные, а также дату последнего изменения (гггг-мм-дд чч: ми: сс.ммм)
SELECT AAA,BBB,LastChgDate FROM YourTable WHERE ID=xxxxxx
выполнить свою бизнес-логику
сохранить данные
UPDATE YourTable SET AAA=aaaaa,BBB=bbbbb WHERE ID=xxxxxx AND LastChgDate=zzzzzz
Если количество строк! = 1, то ошибка кто-то изменил данные, в противном случае данные сохраняются.
Используйте правильный режим изоляции транзакции и все действия в отдельной транзакции базы данных (т.е. запуск транзакции на шаге 1. и фиксация после шага 3.).
Ваш вопрос немного расплывчатый, но я предполагаю, что вам нужен либо режим SNAPSHOT, либо режим READ COMMITTED.