Параллельный доступ к одной и той же таблице с двух серверов - PullRequest
0 голосов
/ 03 марта 2011

Я получаю доступ к таблице SQL Server 2005 из Java J2EE с использованием подготовленных состояний.Банки развернуты на двух серверах и работают параллельно.Процесс выглядит следующим образом:

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

В некоторых случаях пользователи получают 2 электронных письма (по одному от каждого сервера), потому что 2 выбора выполняются одновременно перед оператором удаления,У меня нет прав администратора на столе, просто доступ к нему из приложения Java.

Как я могу заблокировать таблицу при первом выборе и разблокировать ее после удаления?Вы видите другое решение для этого?

1 Ответ

2 голосов
/ 03 марта 2011

Если вы выбираете работу транзакционным способом, ее может забрать только один сервер:

set transaction isolation level repeatable read

update  top 1 tbl
set     ProcessingOnServer = HOST_NAME()
from    YourWorkTable tbl
where   ProcessingOnServer is null
        and Done = 0

Теперь вы можете выбирать детали, зная, что рабочий элемент вам назначен безопасно:

select  *
from    YourWorkTable tbl
where   ProcessingOnServer = HOST_NAME()
        and Done = 0

Функция host_name() возвращает имя клиента, но если вы считаете, что это безопаснее, вы можете передать имя хоста из клиентского приложения.

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

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