Добрый день!
У нас осуществляется телемаркетинг тремя телемаркетологами.
Есть общий список задач на обзвон (предикторы они у нас зовутся).
По логике каждый берет в работу первого свободного и работает с ним.
Вот цепочка запросов:
Вызывается запрос на обновление (во вложении скрин схемы):
UPDATE Предикторы_локал
INNER JOIN Предиктор_резервирование_фильтр
ON Предикторы_локал.Код = Предиктор_резервирование_фильтр.Код
SET Предикторы_локал.Зарезервировал = [TempVars]![Телемаркетолог],
Предикторы_локал.[Дата резервации] = Date()+Time();
Который ссылается на запрос
Предиктор_резервирование_фильтр:
SELECT TOP 1 Предиктор_резервирование_выборка.*
FROM Предиктор_резервирование_выборка;
Который ссылается на запрос
Предиктор_резервирование_выборка:
SELECT Предикторы_локал.Код
FROM (Предикторы_локал
LEFT JOIN Предикторы_звонки_локал ON Предикторы_локал.Код = Предикторы_звонки_локал.Предиктор)
LEFT JOIN (Предикторы_отложенные_локал
LEFT JOIN Сессии_активные ON Предикторы_отложенные_локал.Сотрудник = Сессии_активные.Сотрудник)
ON Предикторы_локал.Код = Предикторы_отложенные_локал.Предиктор
WHERE
(
((Предикторы_отложенные_локал.Код_локал) Is Null)
AND ((Предикторы_звонки_локал.Код) Is Null)
AND ((Предикторы_локал.[Дата резервации])<DateAdd("n",-30,Date()+Time())
Or (Предикторы_локал.[Дата резервации]) Is Null)
AND ((Предикторы_локал.Экспорт)=False)
)
OR
(
((Предикторы_локал.[Дата резервации])<DateAdd("n",-5,Date()+Time())
Or (Предикторы_локал.[Дата резервации]) Is Null)
AND ((Предикторы_локал.Экспорт)=False)
AND ((Предикторы_отложенные_локал.[Отложенаня дата])<(Date()+Time()))
AND ((Предикторы_отложенные_локал.Сотрудник)=[TempVars]![Телемаркетолог])
AND ((Предикторы_отложенные_локал.Звонок_рез_локал) Is Null)
)
OR
(
((Предикторы_локал.[Дата резервации])<DateAdd("n",-5,Date()+Time())
Or (Предикторы_локал.[Дата резервации]) Is Null)
AND ((Предикторы_локал.Экспорт)=False)
AND ((Предикторы_отложенные_локал.[Отложенаня дата])<(Date()+Time()))
AND ((Предикторы_отложенные_локал.Звонок_рез_локал) Is Null)
AND ((Сессии_активные.Код) Is Null)
)
ORDER BY
Предикторы_отложенные_локал.Код_локал DESC ,
[Предикторы_локал]![Речевой модуль]=[TempVars]![РМ],
Предикторы_локал.Приоритет, Предикторы_локал.[Срок отработки],
Предикторы_локал.Код;
В третьем запросе мы всегда проверяем резервацию:
((Предикторы_локал.[Дата резервации])<DateAdd("n",-5,Date()+Time())
Or (Предикторы_локал.[Дата резервации]) Is Null)
Однако периодически происходит конфликт, когда два телемаркетолога получают одно и тоже задание в работу.
После Update я запрашиваю идентификатор зарезервированной записи. и создаются связанные записи в таблице звонков.
И телемаркетологу открывается форма с установленным фильтром.
Но, когда оба телемаркетолога получают задание, то происходит следующее:
в предикторах стоит информация о последней резервации.
Разница между двумя актами резервации - 2-3 секунды.
Во всех указанных выше запросах стоит блокировка изменяемой записи.
В аксе (он кстати 2010-й) стоит блокировка на уровне страниц.
При выполнении запроса в ручном режиме, такого конечно не происходит, такое я могу получить только при стресс-тесте системы, когда в один момент два телемаркетолога целенаправленно нажимают на кнопки...
Видимо Update первого телемаркетолога происходит после Select, но до Update второго.
Как Вы решаете вопросы управления очередью задач? Подскажите пожалуйста.
Как быть? Блокировать таблицу? Что здесь вообще происходит?)))
http://www.sql.ru/forum/1242618/3-telemarketologa-i-access