Один способ обработать это состоит в том, чтобы сделать это в транзакции и заставить Ваш Запрос Select взять блокировку обновления на строках, выбранных, пока транзакция не завершается.
BEGIN TRAN
SELECT Id FROM Table1 WITH (UPDLOCK)
WHERE AlertDate IS NULL;
UPDATE Table1 SET AlertDate = getutcdate()
WHERE AlertDate IS NULL;
COMMIT TRAN
Это устраняет возможность, что параллельный клиент обновляет строки, выбранные в момент между Вашим ВЫБОРОМ и Вашим ОБНОВЛЕНИЕМ.
, Когда Вы будете фиксировать транзакцию, блокировки обновления будут выпущены.
Другой способ обработать это состоит в том, чтобы объявить курсор для Вашего ВЫБОРА с помощью опции FOR UPDATE. Затем ОБНОВИТЕ КУРСОР WHERE CURRENT OF. Следующее не тестируется, но должно дать Вам основную идею:
DECLARE cur1 CURSOR FOR
SELECT AlertDate FROM Table1
WHERE AlertDate IS NULL
FOR UPDATE;
DECLARE @UpdateTime DATETIME
SET @UpdateTime = GETUTCDATE()
OPEN cur1;
FETCH NEXT FROM cur1;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Table1 AlertDate = @UpdateTime
WHERE CURRENT OF cur1;
FETCH NEXT FROM cur1;
END
Вы можете взглянуть на siphon ( http://code.google.com/p/siphon/ ).
На их домашней странице:
Первый в мире бесплатный Приложение SIP / VoIP для iPhone и iPod Touch 1 и 2.
Проект Siphon SIP / VoIP - первый в своей категории, которая работает на iPhone и iPod Touch 2 с гарнитурой для всех SIP-провайдеры. Это родной приложение одобрено для работы на 2.X используя внутренний микро / динамик и гарнитура.
Приложение поддерживает SIP стандартный, с сохранением совместимости с сотнями провайдеров SIP и предлагает графический интерфейс, который сохраняет яблоко дизайн родных приложений для iPhone.