Асинхронные операции SQL

У меня есть проблема, я не уверен, как лучше всего решить.

У меня есть приложение, которое обновляет базу данных в ответ на специальные запросы. Один запрос в особенности довольно распространен. Запрос является обновлением, которое отдельно довольно просто, но имеет некоторые сложные предварительные условия.

  • Для этого запроса бизнес-слой сначала запрашивает ряд данных от слоя данных.
  • Слой бизнес-логики оценил данные из базы данных и параметры от запроса от этого, действие, которое будет выполнено, определяется, и ответное сообщение (сообщения) запроса создается.
  • Бизнес-слой теперь выполняет фактическую команду обновления, которая является целью запроса.

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

7
задан John Saunders 2 June 2010 в 07:30
поделиться

4 ответа

Проще говоря, когда вы выполняете команду update, вы обеспокоены тем, что база данных могла измениться?

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

Дайте мне знать, если я могу помочь в моделировании некоторых аспектов этого.

2
ответ дан 7 December 2019 в 14:30
поделиться

Вы можете сохранить исходное состояние измененных бизнес-объектов и сравнить исходные объекты с их аналогами в базе данных, чтобы проверить, не было ли что-либо изменено.

Если были внесены изменения, у вас есть выбор: объединить объекты на основе исходных, измененных и сохраненных (базы данных) объектов, либо отменить обновление и сообщить клиенту, что обновление не удалось.

2
ответ дан 7 December 2019 в 14:30
поделиться

Это довольно сложно, потому что в вопросе не так много деталей, поэтому я просто приведу простой пример, который вы можете применить в своей ситуации.

Загрузить все данные, а также дату последнего изменения (гггг-мм-дд чч: ми: сс.ммм)

SELECT AAA,BBB,LastChgDate FROM YourTable WHERE ID=xxxxxx

выполнить свою бизнес-логику

сохранить данные

UPDATE YourTable SET AAA=aaaaa,BBB=bbbbb WHERE ID=xxxxxx AND LastChgDate=zzzzzz

Если количество строк! = 1, то ошибка кто-то изменил данные, в противном случае данные сохраняются.

0
ответ дан 7 December 2019 в 14:30
поделиться

Используйте правильный режим изоляции транзакции и все действия в отдельной транзакции базы данных (т.е. запуск транзакции на шаге 1. и фиксация после шага 3.).

Ваш вопрос немного расплывчатый, но я предполагаю, что вам нужен либо режим SNAPSHOT, либо режим READ COMMITTED.

0
ответ дан 7 December 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: