Мы отправляем большое количество писем через пакетный процесс. Этот процесс выполняется внутри CFThread. Каждый набор записей извлекается из SQL Server. Когда мы просматриваем электронные письма, мы обновляем записи как отправленные.CFThread пакетный процесс - отчеты обрабатываются несколько раз
Когда мы запускаем процесс каждую минуту, он отлично работает. При запуске каждые 30 секунд он начинает обработку записей несколько раз.
Хотя мы отмечаем, что записи «вытащили», по-прежнему сталкиваются с проблемами. Похоже, что пока первый запрос все еще обрабатывается, начинается второй запрос. Второй запрос извлекает записи до того, как первый запрос может обозначить их как «вытащил». Таким образом, одни и те же записи обрабатываются дважды.
Я не хочу блокировать стол, потому что пока я занимаюсь записями, я также отправляю электронные письма и обновляю другие записи, отправленные в одной таблице.
База данных: (псевдокод)
BEGIN
DECLARE @MyTempTable table(
ID INT IDENTITY(1,1) NOT NULL,
emailBody varchar(max),
eMailfromdisplay varchar(200),
eMailFromAdr varchar(200),
eMailsubject varchar(200),
emailAdr varchar(200),
FirstName_vch varchar(250),
LastName_vch varchar(250),
Sent INT,
pulled INT,
masterEmailTableID BIGINT
);
insert into @MyTempTable
select Distinct top 1000
emailBody,
eMailfromdisplay,
eMailFromAdr,
eMailsubject,
emailAdr,
FirstName,
LastName,
Sent,
pulled ,
masterEmailTableID
from
emailMasteTable
where
pulled = 0 and
Sent = 0
SELECT TOP 1000 id
,masterEmailTableID
,Email_adr
,firstName
,LastName
,Sent
,pulled
FROM @MyTempTable where sent = 0 and pulled = 0
-- Other tables status updates
update emailMasteTable set pulled = 1 where EmailID IN (Select distinct masterEmailTableID from @MyTempTable);
END
ColdFusion: (псевдокод)
<cfquery name="getMessages">
exec spGetEmailMessages
</cfquery>
<cfoutput query="getMessages">
<cfmail>
<!--- Email Stuff --->
<cfquery>
update emailMasteTable set sent = 1 where EmailID = #getMessages.masterEmailTableID#;
</cfquery>
</cfmail>
</cfoutput>
Я думаю Невозможно сказать, не видя фактического сценария, можете ли вы поделиться им, если это возможно. – Susang
Если несколько потоков могут потенциально получать доступ к записям, недостаточно их отмечать как завершенные * после *, они обрабатываются. Вы ДОЛЖНЫ реализовать какой-то механизм блокировки для предотвращения условий гонки. Например, вы можете реализовать несколько статусов: новый, обработать, завершить, не удалось. Проверьте записи со статусом new и отметьте их * при их извлечении *. Это препятствует тому, чтобы какой-либо другой процесс извлекал одни и те же данные. По завершении обработки отметьте их как завершенные/неудачные, как обычно. – Leigh
* хотя мы отмечаем записи, когда мы тянем как потянутые, но все еще сталкивающиеся с проблемами * Этого не произойдет, если все будет сделано правильно. Вам нужно опубликовать код. В частности, эта часть логики. – Leigh