Я думаю, что нет способа продолжить массовую вставку после сбоя транзакции. Если вам нужно сохранить все оставшиеся значения, вы должны сохранить каждое значение отдельно в методе save()
, отмеченном как @Transactional(propagation = Propagation.REQUIRES_NEW)
, взгляните на документы . Вы также должны поймать DataIntegrityViolationException
где-нибудь, пока он еще не сломается.
Мы делаем это для легкой ситуации с входом:
Action<object> d = delegate(object val)
{
// in this anonymous delegate, write code that you want to run
ProcessDataAndLog();
};
d.BeginInvoke(null, null, null); // this spins off the method asynchronously.
Это ни в коем случае не устойчиво. При необходимости в гарантии того, чтобы быть обработанным, необходимо рассмотреть очередь сообщений. Тем путем можно также разгрузить обработку к отдельной машине и не сорвать веб-сервер.
Править:
Следующее также работает и возможно немного более очевидно для Вашего коллеги - кодера. Это - по существу то же, но по-видимому быстрее и Вы не должны волноваться о вызове EndInvoke ().
System.Threading.ThreadPool.QueueUserWorkItem(
delegate(object state)
{
// in this anonymous delegate, write code that you want to run
ProcessDataAndLog();
});
Дальнейшее чтение: Пул потоков и Асинхронные методы и Асинхронный делегат по сравнению с пулом потоков и потоком и вызовом EndInvoke действительно не вызывают утечку памяти?
Одним путем я сделал это в прошлом, какие игры несколько приятно с веб-моделью, должен иметь "частную" страницу/веб-сервис, которая ответственна за начинание обработки и прислушивается к вызову к ней. Довольно легко иметь страницу, асинхронно говорят с другой страницей и затем продолжают то, что делает пользователь.
Это кажется мне как Вы, должен отделить другой процесс, чтобы сделать то, что необходимо сделать. Вы могли бы даже хотеть создать сервис окон для обработки обработки изображения. Это могло быть приложение, которое сидит без дела, ожидая файла для появления где-нибудь, и когда это делает это может перейти к работе, оставив поток asp.net для движения о его бизнесе.
Я, вероятно, создал бы сервис окон, который работает на сервере, и используйте заливку очередь для обработки фотографии. так изменил бы Ваш
//save the photo on the server
//Add referance in queue (possibly in database to http post that the windows service monitors with details of path to the file, output path, transformation etc.)
//and send viewdata saying "thanks..."
return View();
При выполнении его этот путь фактическая обработка к фотографии является абсолютно отдельной от веб-сайта, и сохраните Вас вращающий потоки повсеместно.
Colin G.
Похоже, что у Вас должен был бы быть 2-й процесс, который заботится о дополнительной обработке. У Вас может или быть своя исходная страница, начинают процесс, или у Вас могло быть автономное приложение, которое опрашивает папку, и обработайте их, когда фотографии прибывают. Таким образом, Вы также предотвращаете обложение налогом Вашего веб-сервера и рабочего процесса.
Я не программист ASP.NET, но способ, которым Вы обычно делаете, это должно запустить другой Поток на сервере, который делает эту фоновую обработку для Вас, в то время как инициирующий Поток возвращает Представление и выходы.
Посмотрите, можно ли найти что-то при поиске "ASP.NET, запускают Поток"