Я бы определенно прочитал каждое письмо из базы данных по отдельности, чтобы избежать второй описанной вами проблемы.
Установите блокировку на строку базы данных (например, select for update
) на случай, если одновременно выполняется несколько процессов (даже если вы не собираетесь этого делать, это может произойти случайно из-за неправильного развертывания, некоторого переключения при сбое, когда исходная служба еще работает, ..)
Отправьте письмо непосредственно перед вамивыполните commit
для транзакции или отправьте сообщение в какую-нибудь асинхронную систему, например, через JMS.Но более простое решение - просто отправить электронное письмо непосредственно перед commit
, если это возможно.Если что-то пошло не так с почтой, вы можете сделать откат.Если ничего не пошло не так, вряд ли что-то пойдет не так с commit
, так что вы, вероятно, в порядке.
В противном случае, если это не вписывается в используемый вами дизайн программного обеспечения (например, электронная почта отправляетсянекоторый метод бизнес-логики и транзакции, управляемые процессом более высокого уровня), тогда вы можете создавать объекты электронной почты и помещать их в список.Непосредственно перед фиксацией вы можете проверить этот список и отправить электронные письма.Таким образом, электронные письма становятся немного более транзакционными, то есть отправляются только тогда, когда вы делаете коммит.