Асинхронные операции SQL - PullRequest
7 голосов
/ 29 марта 2010

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 29 марта 2010

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

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

2 голосов
/ 29 марта 2010

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

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

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

0 голосов
/ 02 июня 2010

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

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

0 голосов
/ 29 марта 2010

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

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

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

делай свою бизнес-логику

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...